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
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".
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.
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 ... –
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). –
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. –
- 1. Entity Framework Table por herencia Jerarquía
- 2. Cambiar el tipo de una entidad que conserva su ID
- 3. Entity Framework 4 - Herencia
- 4. Entidad Framework: herencia, cambie el tipo de objeto
- 5. Entity Framework - ¿Herencia con .Include?
- 6. Entity Framework: Herencia y Incluir
- 7. Entity Framework: mesa de mezclar según el tipo y la tabla por jerarquía
- 8. Generación Entity Framework faltando una entidad
- 9. Entity Framework - Reciclar Tipo Complejo
- 10. entidad tipo de campo en forma symfony2.1
- 11. Entity Framework 4: problema de herencia Tabla por tipo en la inserción
- 12. ¿Cómo crear una entidad de solo lectura en Entity Framework?
- 13. No se puede establecer el campo/propiedad en el tipo de entidad con Entity Framework 4.3.1
- 14. Entity Framework - consulta que especifica el tipo heredado para la propiedad de navegación
- 15. ¿Puedo mezclar tabla por jerarquía y tabla por tipo en Entity Framework?
- 16. Entity Framework: compruebe todas las relaciones de una entidad para el uso de la clave externa
- 17. Entity Framework mapea el tipo de datos float en doble
- 18. Entity Framework Table por tipo Performance
- 19. Validación de Entity Framework
- 20. Entity Framework asigna múltiples tablas a una entidad
- 21. ¿Alternativas a una jerarquía de herencia profunda?
- 22. Problema de implementación de tabla por jerarquía y herencia
- 23. Extraña actualización de entidad en Entity Framework Code-First
- 24. proyecciones de Entity Framework
- 25. Tabla de Entity Framework 4.2 por grupo de jerarquía por discriminator
- 26. Tipo de proveedor para Entity Framework
- 27. WCF con Entity Framework Error Parte II
- 28. Herencia de Entity Framework: TPT, TPH o ninguno?
- 29. Entity Framework - Actividad de auditoría
- 30. Código Entity Framework Primero configure el esquema por entidad
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 / –