.net - net - entity framework inheritance table per type
Entity Framework 4, ¿heredar vs extender? (3)
¿Cuáles son las ventajas / desventajas de cada método?
Sé que he leído en algún lugar, ya sea en un libro o en este sitio, por qué el uso de la herencia de tablas no es bueno para Entity Framework 4.
Por ejemplo, ¿por qué no hacer una tabla que tenga un ID de entidad, un dato creado, un datemodificado y luego dejar que cada otra clase lo herede en el marco de la entidad? Entonces mis tablas para todas las demás entidades no necesitan tener esas columnas. Entonces puedo hacer que una clase de persona herede esa clase base, y luego una persona específica hereda a una persona.
No estoy seguro de las ventajas de esto, aparte de escribir un script SQL más pequeño para generar la base de datos ...
Las desventajas que veo son que hace que consultar / ver los datos directamente en SQL sea un gran problema (toda la información relevante está dividida en tantas tablas), y también le pregunté a mi amigo que dijo:
"Lo más importante que me llama la atención es el hecho de que no quisiera que mi base de datos dependiera de la estructura de herencia actual de mi aplicación. Si, por alguna razón, quisiera cambiar el diseño de mi aplicación en términos de herencia , no importaría porque mis datos no dependerían de mi diseño de sistema actual. Creo que el almacenamiento de datos es simplemente eso: almacenamiento. La base de datos se normaliza de acuerdo con el diseño de base de datos adecuado, pero la herencia es una elección programática de la aplicación. desarrollo, no almacenamiento de datos. Eso solo me impediría usarlo. La herencia es algo muy difícil de hacer correctamente cuando se trata de diseñar una aplicación. Es mucho más fácil cambiar el código de la aplicación que cambiar y migrar los datos de la base de datos cuando la mayoría los desarrolladores con menos experiencia abordan un problema que abordan con herencia. Yo también lo hice cuando comencé a desarrollarlo. lógicamente tiene sentido. Sin embargo, una vez que se desarrolla durante mucho tiempo, se aprende que la delegación es realmente la mejor manera. to go (servicios que llaman servicios en el caso de soa) y que los servicios de un solo propósito proporcionan mucha más reutilización que herencia ".
Lo que también tiene sentido para mí.
Asi que
1) En general, ¿cuáles son las ventajas / desventajas de la herencia frente a la extensión?
2) En mi ejemplo específico anterior, ¿qué sería más apropiado?
3) Si mi ejemplo es malo para uno o ambos, ¿cuál es un buen ejemplo para usar la herencia y para usar la extensión?
He usado ambos antes, pero como estoy lejos de ser experimentado, todavía no estoy seguro de cómo manejar todas las situaciones.
10 votos, 8 favoritos, más de cien vistas y nadie puede expandirse. = (.
Llego un poco tarde a la fiesta, pero he tenido las mismas preguntas que usted con respecto a la herencia en EF y encontré un resumen bastante bueno para que lo lea. Es un extracto del libro Programme Entity Framework de Julie Lerman .
Después de leerlo, aquí están mis conclusiones sobre el tema:
1) En general, ¿cuáles son los pros / contras de la herencia frente a la extensión ? Los pros realmente dependen de la estrategia de mesa que elija. Vea Cómo elegir una estrategia de herencia - Blog de MSDN . Sin embargo, solo son "profesionales" en el supuesto de que usted ya haya decidido utilizar la herencia. Y eso no es una decisión a tomar a la ligera.
Las desventajas son muchas, pero la mayor es la incapacidad de agregar una entidad existente a la base de datos como una entidad derivada. Por ejemplo: tengo un estudiante que hereda de la persona. Hay un registro de persona para John Smith. Algún tiempo después necesito que John Smith sea un estudiante. Bien muy mal Eso no es posible. (Al menos no sin eludir EF con un procedimiento almacenado).
2) En mi ejemplo específico anterior, ¿qué sería más apropiado? - En su ejemplo, solo debe agregar esas columnas (entityId, datecreated, datemodified) a las tablas que las necesiten. Podría usar un Tipo Complejo para datos creados y matizados, pero eso no sería necesario a menos que sea un tipo SECO muy estricto. Incluso entonces, podría ser una exageración. La razón es que una vez que tiene una entidad, nunca puede agregar esa entidad a otra tabla derivada. Una Persona (que es una BaseEntity) no puede agregarse como Estudiante más adelante. Además, escribir consultas LINQ sería mucho más complejo de lo necesario. Alex ya lo demostró.
3) Si mi ejemplo es malo para uno o ambos, ¿cuál es un buen ejemplo para usar la herencia y para usar la extensión? - Generalmente, si puede hacer su resumen de tipo base, la herencia podría funcionar para usted. Pero aún debe considerar otras opciones primero. Si su tipo de base se creará directamente como instancia en algún lugar, solo use la composición. La herencia se vuelve muy problemática cuando se trata de consultar e insertar registros.
En resumen, solo porque pueda hacer herencia en EF no significa que deba hacerlo. Si puede salirse con un diseño libre de herencia, entonces hágalo.
Una desventaja de usar la herencia en su modelo es que no podrá mostrar su modelo a través de WCF Data Services (OData), ya que actualmente no admite entidades derivadas.
He intentado algo similar a lo que usted describe, y el principal problema que veo es que no puede crear ObjectSet<T>
para el tipo derivado. Por lo tanto, no tendrá el ObjectSet<Person>
. Si deriva todas sus Entidades de, por ejemplo, la entidad BusinessObject, solo podrá trabajar con ObjectSet<BusinessObject>
. Si desea consultar solo el repositorio de personas, puede escribir consultas como Context.BusinessObjectSet.OfType<Person>().ToList()
pero creo que no generará el SQL adecuado bajo el capó y primero obtendrá las filas completas de BusinessObject y luego filtrará Entidades personales en memoria. Así que supongo que tendrá un gran impacto en el rendimiento.