1

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

模块为基础应用程序提供额外的视图和服务(即扩展基础应用程序)。大多数时候,他们会向基础应用程序添加额外的用例。

关于 DbContext 的实际问题:模块扩展数据库中的表数量或扩展现有表(通过从基本模型类继承)。

a) 有没有办法为模块提供统一的 DbContext 而无需在其 DbContext 中重写所有 DbSet<...>s?从基础应用程序的 DbContext 继承不起作用,因为模块可以依赖于多个其他模块,并且 C# 不支持多重继承。

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

希望有任何模式或想法可以在 C# / Entity Framework 中实现这样的场景。

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

4

1 回答 1

0

好吧,我猜如果您使用具有更多表的 dbContext,例如,每种情况下的业务逻辑都是不同的。因此,也许您可​​以执行以下操作:

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

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

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

于 2013-04-21T11:02:26.503 回答