Estoy buscando sugerencias sobre cómo abordar el uso de un ORM (en este caso, EF5) en el diseño de aplicaciones no monolíticas modulares, con La parte central y los módulos de terceros, donde el núcleo no tiene referencia directa a los módulos de terceros, y los módulos solo tienen una referencia a las tablas y clases principales/comunes.EF: En busca de una estrategia de diseño para DatabaseFirst DbContext de una Aplicación modular
Por razones de argumento, una analogía suficientemente cercana sería DNN.
CodeFirst:
Con CodeFirst, el enfoque que utilicé fue para construir el modelo de la Db era a través de la reflexión: en la fase DbInitialation de DbContext del Núcleo, solía Reflexión de encontrar cualquier clase en cualquier DLL (por ejemplo, Core o varios módulos) decorados con IDbInitializer (un contrato personalizado que contiene un método Execute()) para definir solo la estructura del dll. Cada DLL agregó al DbModel lo que sabía de sí mismo. Cualquier Siembra subsecuente también se manejó en el mismo wa (buscando un contrato IDbSeeder específico, y ejecutándolo).
Pro: * el enfoque funciona por ahora. * El mismo núcleo DbContext se puede usar en todos los repositorios, siempre que cada repositorio use dbContext.GetSet(), en lugar de esperar que sea una propiedad de dbContext. No es gran cosa. Contras: * solo funciona al inicio (es decir, agregar nuevos módulos requeriría una actualización de AppPool). * CodeFirst es ideal para un POC. Pero en EF5, no es lo suficientemente maduro para el trabajo empresarial pero (y no puedo esperar a que se agregue EF6 para StoredProcs y otras características). * Mi DBA odia CodeFirst, al menos para el Core, que quiere optimizar esa parte con Stored Procs tanto como sea posible ... Somos un equipo, así que tengo que tratar de encontrar una manera de complacerlo, si se puede encontrar una manera ...
base de datos en primer lugar:
la fase DbModel parece estar ocurriendo antes del constructor de la DbContext (al leer el archivo de recursos .edmx * incorporado). DbInitialization nunca se invoca (ya que el modelo se considera completo), por lo que no puedo agregar más tablas de las que el Core conoce.
Si no puedo agregar elementos al Modelo, dinámicamente, como se puede hacer con CodeFirst, significa que * o el Modelo de Core DbContext tiene que tener conocimiento de cada tabla en el Db-Core Y cada 3 módulo. Haciendo la aplicación monolítica y altamente acoplada, derrotando lo que estoy tratando de lograr. * O cada tercero tiene que crear su propio DbContext, importar tablas Core, lo que lleva a * problemas de versionado (el módulo no actualiza sus * .edmx's cuando Core's * .edmx está actualizado, etc.) * duplicación en todas partes, en diferentes memorias contextos = difícil de rastrear problemas de concurrencia.
En este punto, me parece que el enfoque CodeFirst es la única forma en que se puede lograr el software Modular con EF. Pero, con suerte, alguien más sabe cómo hacer que DatabaseFirst brille: ¿hay alguna manera de "agregar" DbSet al modelo creado a partir del archivo * .edmx incrustado?
¿O alguna otra idea?