asp.net - net - entity framework core initializer
¿Es ADO.NET Entity Framework(con ASP.NET MVC v2) una opción viable cuando se escriben sitios web personalizados y actualizados? (4)
Acabo de terminar de revisar el tutorial de MvcMusicStore que se encuentra aquí . Es un excelente tutorial con código fuente funcional. Uno de mis tutoriales MVC v2 favoritos hasta el momento.
Ese tutorial es mi primera introducción al uso de ADO.NET Entity Framework y debo admitir que la mayor parte fue muy rápido y directo. Sin embargo, estoy preocupado por la facilidad de mantenimiento. ¿Qué tan personalizable es este marco cuando el cliente solicita características adicionales a su sitio que requieren nuevos campos, tablas y relaciones?
Estoy muy preocupado por no poder ejecutar de manera eficiente las órdenes de cambio del cliente porque los modelos de la Entidad son básicamente código generado por computadora de arrastrar y soltar. Mi experiencia con los generadores de código no es buena. ¿Qué pasa si algo sale mal en las entrañas de la modelo y no puedo volver a juntar a humpty-dumpty?
A la larga, me pregunto si el uso de modelos escritos a mano que los seres humanos pueden leer y editar es un curso más eficiente que utilizar Entity Framework.
¿Alguien ha trabajado lo suficiente con el marco de la entidad para decir que se sienten cómodos usándolo en un entorno de desarrollo muy fluido?
A partir de Entity Framework 4 (con Visual Studio 2010), el código generado se genera a partir de archivos T4 (Text Template Transformation Toolkit) que puede editar para que tenga control total sobre lo que se genera. Vea el blog de Oleg Sych, que es una mina de información sobre T4. La generación de código no es un problema y T4 abre tantas perspectivas que ya no puedo vivir.
Actualmente estoy trabajando en un proyecto en el que utilizamos Entity Framework 4 para la capa de acceso a datos y Scrum como el método de administración de proyectos ágil. De un sprint a otro, se agregan varias tablas, se agregan otros requisitos nuevos y modificados. Cuando se ha ejecutado una vez en cada posible problema EF (como saber que los valores predeterminados de la base de datos no se conservan de manera predeterminada en el archivo .edmx, o cambiar una columna que admite nulos por una no modificable y actualizar el diseñador no cambia la propiedad asignada estado), eres bueno para ir.
Editar: para responder a su pregunta, es EF 4 cuya generación de código se basa en T4 en lugar de T4 que soporta EF. En EF 3.5 (o EF 1.0 si lo prefiere), en teoría podría usar T4 escribiéndolos desde cero, analizando el archivo EDMX en el código T4 y generando sus entidades. Sería mucho trabajo teniendo en cuenta que todo esto ya lo hace EF 4. Además, Entity Framework 3.5 solo admite un tipo de entidad, mientras que EF 4 como plantillas integradas o descargables para entidades POCO (que no saben nada acerca de la persistencia), Entidades de auto-seguimiento ...
Teniendo en cuenta el Entity Framework en sí mismo, creo que le faltaban muchas características en su primer lanzamiento, y aunque era utilizable, fue bastante frustrante de usar. EF4 es mucho más mejorado. Todavía carece de algunas características básicas (como el soporte enum), pero ahora se ha convertido en mi capa de acceso a datos de elección.
No estoy muy familiarizado con Entity Framework, pero creo que simplemente genera un archivo EDM que puede ser editado a mano. Sé que lo he hecho con bastante frecuencia con los archivos DBML de Linq a SQL que genera el diseñador (a menudo es más rápido editarlos a mano que utilizar el diseñador para pequeños retoques).
Sabes que me interesaría si algún desarrollador puede dar una idea de esto. Todos los ejemplos de Entity Framework parecen consistir en unas diez o veinte tablas, lo que realmente es a pequeña escala.
¿Qué hay de usar el EF en una base de datos con cientos o incluso miles de tablas?
Personalmente, conozco a varios desarrolladores y organizaciones que fueron quemadas por LINQ-to-SQL y que están demorando aproximadamente un año para ver qué dirección toma EF.
He estado usando el marco de la entidad (V1.0) durante aproximadamente un año en mi proyecto actual. Tenemos cientos de tablas, todas agregadas a edmx. Problemas que enfrentamos (aunque no estamos seguros de si el nuevo marco de entidad resuelve estos problemas)
Cuando esté acostumbrado a VS.net IDE, estará acostumbrado a realizar todas las operaciones de arrastrar y soltar desde su IDE. El problema es que, una vez que edmx aloja cientos de tablas, el IDE realmente se para y tendrías que esperar 3-4 minutos para que responda.
Con tantas tablas, cualquier edición que realice en el edmx tarda mucho.
Cuando va a usar un control de versión, comparar 10000 líneas XML es bastante doloroso. Piense en fusionar 2 sucursales, cada una con un edmx de 10000 líneas, las tablas, una nueva asociación entre tablas, asociaciones eliminadas y yendo y viniendo comparando xmls. Necesitaría una buena herramienta de comparación xml si realmente quiere fusionar 2 grandes archivos edmx
Por razones de rendimiento, teníamos que convertir los recursos csdl, msl y ssdl en recursos integrados.
Su edmx debe estar sincronizado con su base de datos todo el tiempo, o al menos, cuando intente actualizar el edmx, intentará sincronizarse y podría arrojar algunos errores oscuros si no están sincronizados.
Tenga en cuenta que sus entidades (tablas / vistas) siempre deben tener una clave principal, de lo contrario obtendrá errores poco claros. Ver mi otra pregunta aquí
Cosas que hicimos / Podría considerar en el futuro cuando uso EF
Utilice edmx múltiple utilizando 1 edmx para tablas agrupadas / vinculadas lógicamente juntas. Tenga en cuenta que si hace esto, cada edmx debe vivir en su propio espacio de nombres. Si intenta agregar 2 tablas relacionadas (por ejemplo, persona y dirección) a 2 edmx en el mismo espacio de nombres, obtendrá un error de compilación que indica que la relación de la clave externa ya está definida. (Sugerencia: cree una carpeta y cree el edmx debajo de esta carpeta. Si intenta modificar el espacio de nombres en el edmx sin tener la carpeta, no guardará correctamente el espacio de nombres la próxima vez que lo abra / edite)
fewer tables in edmx => less heavy container => good
menos tablas en edmx => más fáciles de combinar al fusionar 2 ramas
Tenga en cuenta que el contexto del objeto no es seguro para subprocesos
Su repositorio (o el DAO que use) debería ser responsable de crear y eliminar el contenedor que crea. El uso de frameworks DI, especialmente en una aplicación web, nos complica las cosas. Las solicitudes web se sirven desde el grupo de subprocesos y el contenedor no se eliminó correctamente después de que se sirvió la solicitud web, ya que el subproceso en sí no se eliminó. El contenedor se reutilizó (cuando se reutilizó el hilo) y creó muchos problemas de concurrencia
No confíe en su VS IDE. Obtenga un buen editor XML y sepa cómo editar el archivo edmx (aunque no necesita editar el diseñador). Ensuciarse las manos
SIEMPRE SIEMPRE SIEMPRE (simplemente no puedo enfatizar esto lo suficiente) ejecutar un generador de perfiles SQL (y me refiero a todos y cada uno de los pasos de tu código) cuando ejecutas tus consultas. Por más compleja que parezca la consulta, te sorprenderá ver cuántas veces tocas el ejemplo DB: (lo siento, no se puede obtener el código en el formato correcto, ¿alguien puede formatearlo?)
var myOrders = from t in context.Table where t.CustomerID=123
seleccionar t; // la consulta anterior aún no se ejecutó
if(myOrders.Count>0)//DB query to find count { var firstOrder = myOrders.First()//DB query to get first result }
Mejor enfoque
// la consulta se materializó, solo 1 acierta a DB ya que estamos usando ToList () var myOrders = (desde t en Context.tables donde t.customerID = 123 seleccione t) .ToList ();
if(myOrders.Count>0)//no DB hit { //do something var myOrder = myOrders[0];//no DB hit }
Sepa cuándo utilizar el seguimiento y no realizar el seguimiento (para solo lectura) y las aplicaciones web hacen muchas lecturas que escrituras. Configúrelos adecuadamente cuando inicialice su contenedor
¿Olvidé las consultas compiladas? Mira aquí para más regalos
Cuando recupere miles de filas de su base de datos, asegúrese de usar IQueryable y separar el objetoContext para que no se quede sin memoria
Actualizar:
Julie Lerman aborda el mismo problema con una solución similar . Su publicación también señala el trabajo de Ward en el manejo de un gran número de tablas