动态DB上下文

本文关键字:上下文 DB 动态 | 更新日期: 2023-09-27 18:10:14

我的应用程序有一个底层模型,我使用实体框架DbContext进行数据访问。除了基本应用程序之外,还有动态加载的模块,每个模块由一个程序集表示,并在运行时由主应用程序加载(所有要加载的模块都在配置文件中进行配置)。模块之间可以进一步相互依赖,例如ModC需要加载ModA和ModB。

模块为基础应用程序提供额外的视图和服务(即扩展基础应用程序)。大多数时候,他们会向基础应用程序添加额外的用例。 关于DbContext的实际问题:模块扩展数据库中的表数量或扩展现有表(通过继承基模型类)。

a)是否有一种方法来提供一个统一的DbContext到一个模块而不重写所有的DbSet<…>s在他们的DbContext?从基本应用程序的DbContext继承不起作用,因为模块可以依赖于多个其他模块,c#中不支持多继承。

b)如何正确运行实体框架数据库迁移,以正确地从加载的模块中不合作所有迁移脚本?更准确地说:模块只允许添加/扩展现有的DB结构,因此迁移应该在模块第一次被加载时发生,一旦模块被卸载,更改不应该被删除,但是,如果模块更新了,DB应该在下一次加载模块时被迁移。

希望有任何模式或想法来实现这样的场景在c#/实体框架。

编辑:在视图方面,它是比较容易实现与MVC的可插拔区域:动态扩展应用程序的特性?我希望数据层也有类似的东西。

动态DB上下文

嗯,我猜,如果您使用具有更多表的dbContext,那么每种情况下的业务逻辑都是不同的。也许你可以这样做:

1。-定义一个接口,该接口具有使用数据库所需的CRUD操作和其他方法。

2。—实现实现此接口的存储库。您可以有多个存储库,因此每个存储库使用一个不同的模块。

3。-在主应用程序中,您使用接口,该接口实例化了每种情况下所需的存储库。你调用接口的方法,在主应用中总是有相同的代码。唯一需要的是知道何时使用存储库或其他。这可以通过反射或作为工厂的类来完成,该类决定使用哪个存储库。