2009-09-01 26 views
7

Tengo una jerarquía de herencia con una entidad Employee base y algunas entidades descendientes para tipos de empleados específicos. Necesito poder convertir una entidad Empleado base en una entidad más específica (por ejemplo, Empleado temporal) y de un tipo más específico volver al tipo base (por ejemplo, si un empleado ya no es "temporal" entonces quiero que esa instancia sea solo persistió como empleado. En la base de datos, esto es solo cuestión de agregar o quitar una fila de la tabla para la subclase específica. (Estoy usando tabla por clase). No estoy viendo cómo hacer esto usando llamadas EF, aunqueCambiar el tipo de entidad (Entity Framework) que forma parte de una jerarquía de herencia

Respuesta

4

Técnicamente, puede lograrlo utilizando el procedimiento almacenado. TPT no lo admite.

Sin embargo, estoy totalmente de acuerdo con Craig. En el libro de programación clásico Design Patterns (Addison-Wesley Professional), los autores discuten la herencia versus la composición y concluyen que uno debe "favorecer la composición sobre la herencia".

+0

Sí, por ahora lo he implementado usando procedimientos almacenados. Esta fue la recomendación de MSFT también: "No se puede hacer esto directamente en Entity Framework. Su mejor opción sería escribir procedimientos almacenados para realizar estas conversiones" http://social.msdn.microsoft.com/Forums/ en-US/adodotnetentityframework/thread/860d7913-7baa-43e9-a2a7-83b25ad9c558 / –

7

Uno de los principios de OOP es que las instancias no pueden cambiar su tipo. Piense: ¿Puede hacer esto con objetos ordinarios de .NET? Por supuesto que no. No puede hacer una ronda final alrededor de esta regla rápida por persistiéndolos con el EF, ya sea.

Agregar una fila al DB no cambia el tipo de una instancia e, cualquiera; solo le miente al EF sobre lo que salvaste. En el dominio relacional, está agregando una relación, sin cambiar la clase de un objeto, porque el dominio relacional no conoce los objetos.

Por lo tanto, no podemos olvidar que el uso de EF no cambia la regla de .NET de que las instancias no pueden cambiar su tipo.

¿Qué debe hacer cuando necesita hacer esto, entonces? Bueno, piensa en cómo funciona esto en tu dominio de problema. Un empleado es una persona. Su estado de empleo está relacionado con la persona, pero su estado no es realmente la persona.

Usa la composición en lugar de la herencia. Probablemente modelaría esto como Persona, con una colección de instancias de Empleo. A medida que cambia la situación de empleo de una persona, puede asignar fechas de detención/finalización a los registros anteriores y agregar nuevos registros para nuevos trabajos.

Me pasó a leer this blog post esta mañana, lo que puede ser un tema de reflexión.

Editado para agregar Si trabaja alrededor de esto mediante la implementación de un procedimiento almacenado de base de datos, asegúrese de que nadie esté realmente utilizando el sistema en el momento en que lo ejecuta. Como esto es completamente ilegal en el espacio de objetos .NET, Entity Framework supone que no puede suceder. Si elude Entity Framework y lo hace, y un usuario tiene un ObjectContext activo en ese momento, este ObjectContext no estará sincronizado con la base de datos de manera que las protecciones de concurrencia optimista normales en Entity Framework no detectaron . No dañará los datos, pero el usuario con el ObjectContext activo puede ver algunos errores increíblemente extraños.

+1

Buenos comentarios. La herencia parece más natural aquí, ya que me permite definir las relaciones entre los tipos más específicos. Sí, la publicación de blog interesante a la que también se vincula: cambiar una entidad al tipo base es una forma de eliminar, tal vez no debería hacer eso en absoluto ... –

+0

Acerca de la edición añadida: EF no puede y no puede asumir que es el único proceso que actualiza la base de datos. De hecho, en la mayoría de los casos no lo es: es probable que tenga al menos varias instancias del ObjectContext que opere contra el mismo DB (por ejemplo, una por usuario en el caso de una aplicación web). –

+0

No dije que EF supone que es el único proceso que actualiza la base de datos, porque sería incorrecto.Dije que devuelve mensajes de error extraños cuando algún proceso externo "corrompe" la base de datos. Y el EF considera que cambiar el tipo de instancia es una corrupción, por muy buenas razones. Esto es solo un problema si (1) hay un contexto de objeto activo con el objeto en la memoria, luego (2) algún otro usuario "cambia el tipo", entonces (3) el contexto original hace algo con el objeto. El EF detectará el problema y devolverá un error altamente técnico. Como dije, no es seguro para múltiples usuarios hacer esto. –

Cuestiones relacionadas