2010-06-22 22 views
9

Tenemos un sitio web ASP.Net MVC2, y estamos utilizando EF4 para el acceso a la base de datos, etc. Siendo nuevos en EF4, hemos encontrado el concepto POCO EF4, sin embargo no lo comprendemos del todo.¿Cuándo se debe usar POCO en EF4?

En general, escuché POCO definido como objetos "que no dependen de un marco externo". En el caso de EF4, supongo que esto significa que POCO implicaría de alguna manera la creación de entidades más livianas. Si este es el caso, qué tubería de EF4 no tiene POCO, cuáles son los pros/contras de esto, qué trabajo de desarrollo adicional podría necesitarse con POCO. En resumen, ¿cuándo es bueno usar POCO en EF4?

Respuesta

14

"POCO" es un término vago en el espacio ORM. La gente lo usa para significar:

  • "POCOS" POCO, que no cambian el seguimiento, la carga diferida, tienen propiedades privadas, etc. Puede ser un reto trabajar con ellos.
  • Proxies Psuedo-POCO: los tipos con todo public virtual y que tienen diferentes tipos en tiempo de ejecución.
  • Entidades de seguimiento automático. No POCO, pero tampoco EntityObject.

puedo encontrar la definición "no depende de un marco externo" a ser algo de auto-servicio. Es una forma de ignorar las limitaciones de un marco. Es decir, los proxies no son POCO reales en mi libro, pero cumplen con esa definición.

¿Qué pasa con EntityObject? No mucho. Es bastante liviano, y es parte de .NET. Está en el perfil del cliente .NET 4, incluso. Ni siquiera te encadena a la FE. Aunque sería un poco extraño usarlo como un "tipo de POCO" con un marco diferente, funcionaría muy bien. Sin embargo, no está en Silverlight, IIRC.

Las entidades POCO son más difíciles de manejar, porque se pierden las cosas que EntityObject le dan de forma gratuita. Eso no es mucho, sino algo a tener en cuenta antes de elegir POCO solo porque "son geniales", especialmente para aquellos que son nuevos en EF.

Una cosa que muchas personas que se vuelven religiosas acerca de las POCO tienden a ignorar: El mapeo de tipos no POCO de ninguna manera lo limita a exponer esos tipos no POCO externamente. Sus servicios de datos puede proyectar asignada tipos no POCO en unmapped dtos POCO y se puede elegir sólo a exponer esos tipos, es decir:

public IEnumerable<FooDto> IFooRepository.SelectAll() 
{ 
    return from f in Context.Foos 
      select new FooDto { Id = f.Id, Name = f.Name }; 
} 

Así cartografía de tipos y tipos de servicios de datos pueden ser fácilmente diferentes preocupaciones, si así lo desea .

¿Cuándo es absolutamente necesario que no EntityObject tipos de mapeo? Bueno, si necesita entidades de seguimiento automático, entonces es un caso abierto y cerrado. Si debe exponer sus tipos mapeados a Silverlight, claramente también.

Más allá de eso, está menos claro. Si está escribiendo un servicio de datos para consumo público, entonces no debe hacer que los DTO sean subtipos EntityObject, porque eso obstaculizaría el camino de conectar un marco diferente más adelante. Nunca haría una interfaz pública inmutable, dependiente de cualquier marco, incluso uno incluido en .NET. Por otro lado, como dije antes, puede exponer un tipo y asignar otro; no hay ningún requisito para exponer los tipos mapeados, nunca, y a menudo muy buenas razones para no exponerlos (tal vez contengan datos no públicos).

+0

Me gustaría agregar que he estado usando POCO ahora principalmente para poder agregar anotaciones de datos a mis propiedades, algo que no creo que sea sensato hacer en el archivo de diseñador de EF ya que podrían ser atacadas cuando se actualiza Aunque probablemente debería utilizarlos en mis Modelos de visualización, es más fácil para la mayoría de mis necesidades agregarlos directamente en el POCO. – JasperLamarCrabb

+4

@CannibalCorpse: las clases de EF son parciales y no es necesario modificar el código generado automáticamente. No hay problema con el uso de DataAnnotations con EF, solo tiene que usar clases de metadatos. – LukLed

9

Estoy totalmente de acuerdo con Craig, POCO es algo con lo que es más difícil trabajar.

añadiré más sobre el propósito de POCO, espero que usted entienda cuándo y cuándo no usarlo.

del modelo y de servicio es el núcleo

del modelo y de servicio es una de las piezas más importantes de su aplicación, es un no-no-no para cambiar, no se puede evitar con el modelo fuertemente pareja y servicio con cualquier parte de su aplicación, por lo tanto, pequeños cambios de modelo requieren el cambio de toda la aplicación.

Se trata de la flexibilidad

POCO es una cuestión de lenguaje específico, no-marco específico. es una clase simple, que no tiene dependencia con la clase específica de framework, puede usar POCO en todas las versiones de .NET incluyendo micro framework y framework compacto.

Es acerca de las pruebas

POCO muy fácil de probar la unidad, ya que no tiene dependencia con una clase no-unidad de prueba de usar.

Se acerca se cambia

Upgrade/Downgrade, hacer nueva aplicación cliente en diferentes environtment tales como mono? no habrá problema, puede seguir usando su servicio y modelo, incluso para la peor actualización/baja pendiente solo se producirá en View and Service Cotext Helper.

Se trata naturales

crear y trabajar con POCO es fácil y natural, puede escribir sus procesos de negocio con claridad.

Pero recuerde POCO no es amigable con el marco

Estoy de acuerdo con Craig, POCO es TOO COOL, se refresca también para hacer amigos con gente nueva. mira WPF es necesario un modelo que implemente INotifyPropertyChanged, ¿qué haces para lograrlo? puedes hacer un contenedor o puedes hacer un proxy dinámico de tu modelo. pero eso requiere más técnica avanzada y código para mantener.

Cuestiones relacionadas