18

¿Cuáles son las ventajas/desventajas de cada método?Entity Framework 4, heredando vs extendiendo?

Sé que he leído en alguna parte, ya sea en un libro o en este sitio por qué utilizar la herencia de tablas es horrible para Entity Framework 4.

Por ejemplo, por qué no hacer una tabla que tiene una entityId, DateCreated, DateModified y luego tienen todas las otras clases heredan eso 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 persona herede esa clase base, y luego una persona específica hereda a la persona.

No estoy seguro de las ventajas de esto, sin embargo sí que escribir una secuencia de comandos SQL más pequeño para generar la base de datos ...

Las desventajas son que veo que hace la consulta/visualización de los datos directamente en SQL un gran dolor en el culo (toda la información relevante está rota en tantas tablas), y también le pregunté a mi amigo quien dijo:

"Lo más importante que me queda es el hecho de que no me gustaría que mi base de datos confío en 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 de mi diseño de sistema actual. Pienso en el almacenamiento de datos simplemente como eso: almacenamiento. la base de datos se normaliza de acuerdo con el diseño adecuado de la base de datos, pero la herencia es una opción programática de desarrollo de aplicaciones, no de 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 de los desarrolladores menos experimentados se acercan a un problema con herencia. Yo también lo hice cuando comencé a desarrollar. lógicamente tiene sentido. sin embargo una vez desarrollando desde hace mucho tiempo se aprende que la delegación es realmente el mejor camino a seguir (servicios de los servicios en el caso de SOA llamar) y que los servicios de un solo uso proporcionan mucha más reutilización de herencia."

Qué también tiene sentido para mí.

Así

1) En general, ¿cuáles son las ventajas/desventajas de la herencia vs extendiéndose
2) En mi ejemplo específico anterior, lo que 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 ambas antes, pero como estoy lejos de estar sazonado, todavía no estoy seguro de cómo manejar todas las situaciones.

10 Votos, 8 favoritos, más de cien vistas y nadie puede expandir? = (.

Respuesta

5

que han intentado algo similar como usted la describe, y el principal problema que veo, es que u no puede crear ObjectSet<T> de tipo derivado. Por lo que no tendrá ObjectSet<Person> repositorio. Si usted deriva todas sus entidades de, por ejemplo, la entidad BusinessObject, podrá trabajar solo con ObjectSet<BusinessObject>. Si desea consultar únicamente el repositorio de personas, puede escribir una consulta como Context.BusinessObjectSet.OfType<Person>().ToList(), pero creo que no generará el SQL correcto bajo el capó y obtendrá primero las filas completas de BusinessObject y luego filtra las entidades Persona en la memoria, así que supongo que tendrá un gran impacto en el rendimiento.

+0

Gracias por la respuesta BP, ¿hay alguna posibilidad de que pueda ampliar esto más? ¿O no hay otros pros y contras? Entonces, ¿cuál sería un buen ejemplo para usar la herencia? – SventoryMang

+0

En realidad, .OfType se filtra en el lado de SQL, IIRC –

3

Una desventaja de usar 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.

9

Llego un poco tarde a la fiesta, pero he tenido las mismas preguntas con respecto a la herencia en EF y he encontrado un resumen bastante bueno para que lo leas. Es un excerpt from Julie Lerman's book Programming Entity Framework.

Después de leerlo, aquí están mis conclusiones sobre el tema:

1) En general, ¿cuáles son las ventajas/desventajas de la herencia que se extiende frente a - Los pros realmente dependen de la estrategia de mesa que elija. Ver How to choose an Inheritance Strategy - MSDN Blog. Sin embargo, solo son "profesionales" en el supuesto de que ya haya decidido usar la herencia. Y esa no es una decisión a tomar a la ligera.

Las desventajas son muchas, pero la más grande es la imposibilidad de agregar una entidad existente en la base de datos como una entidad derivada. Por ejemplo: Tengo un Estudiante que hereda de Persona. Hay un registro de persona para John Smith. Algún tiempo después necesito que John Smith sea un Estudiante. Bien, mal. Eso no es posible. (Al menos no sin eludir EF con un procedimiento almacenado).

2) En mi ejemplo específico anterior, ¿cuál sería más apropiado? - En su ejemplo, solo debe agregar esas columnas (entityId, datecreated, datemodified) a las tablas que las necesitan. Podría usar un tipo complejo para datecreated y datemodified, pero eso no sería necesario a menos que sea un tipo DRY muy estricto. Incluso entonces, podría ser excesivo. 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 Entidad Base) no se puede agregar como Estudiante más tarde. 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 una o ambas, ¿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 debes considerar otras opciones primero. Si su tipo de base se instanciará directamente 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 puede heredar en EF no significa que deba hacerlo. Si puede salirse con la suya con un diseño libre de herencia, entonces hágalo de todos modos.

Cuestiones relacionadas