我的应用程序有一个底层模型,我使用Entity Framework DbContext进行数据访问。除了基础应用程序之外,还有动态加载的模块,每个模块由一个程序集表示,并在运行时由主应用程序加载(所有要加载的模块都在配置文件中配置)。模块可以进一步相互依赖,例如, ModC需要加载ModA和ModB。
模块为基础应用程序提供了额外的视图和服务(即扩展基础应用程序)。大多数情况下,他们会向基础应用程序添加其他用例。
有关DbContext的实际问题: 模块扩展了数据库中表的数量或扩展了现有表(通过继承基本模型类)。
a)有没有办法向模块提供统一的DbContext而无需在其DbContext中重写所有DbSet< ...>?从基础应用程序的DbContext继承不起作用,因为模块可以依赖于多个其他模块,并且C#中不支持多继承。
b)如何正确运行Entity Framework数据库迁移,以正确地从已加载的模块中操作所有迁移脚本?更准确地说:允许模块仅添加/扩展现有的DB结构,因此迁移应该在第一次加载模块时发生,一旦模块卸载就不应该删除更改,但是,如果模块更新,则DB应该在下次加载模块时迁移。
希望在C#/ Entity Framework中实现这样的场景有任何模式或想法。
编辑:在视图方面,与MVC的可插拔区域相比,它易于实现: Dynamically extending features of an application? 我希望数据层有类似的东西。
答案 0 :(得分:0)
好吧,我想如果你使用一个包含更多表的dbContext,那么业务逻辑在每种情况下都是不同的。所以也许你可以做到以下几点:
1.-定义一个具有CRUD操作的接口和使用数据库所需的其他方法。
2.-实现实现此接口的存储库。您可以拥有许多存储库,因此每个存储库都使用不同的模块。
3.-在主应用程序中,使用接口,该接口在每种情况下都使用您需要的存储库进行实例化。所以你调用接口的方法,在主应用程序中总是有相同的代码。只需要知道何时使用存储库或其他。这可以通过反射或用作工厂的类来决定使用哪个存储库。