首先使用 ef4 代码,您可以创建和编译类和 dbcontext。当您想在模型集的已编译 dll 中添加一些类/表和关系时会发生什么?
到目前为止,我提出的解决方案是使用“部分”类,稍后会对其进行补充,第二个是编写一个全新的 dbcontext,其中以某种方式包含第一个或扩展它,但这意味着额外每个模块的数据库连接(每个数据库上下文)。有什么想法吗?最佳做法是什么?我还需要能够处理迁移。
更明确地说,一种可能的情况如下:
A)您创建一个 .dll,其中包含一些 dbContextBase 类和表(类)。
B)您以自己的方式创建依赖/扩展 dbContextBase 的其他 .dll*
C)您在项目中引用所述 .dll 并扩展它们。
所以基本上你可以有一个核心 dbContext,然后向它添加一个菜单模块,然后向它添加一个博客模块(但它可以被菜单模块看到,以便创建最新的博客文章菜单等)。最重要的是,如果您想要一个特定的一次性博客功能,您可以快速集成它,同时保持您的博客模块可更新。
正如我开始看到的那样,最好的方法是 Nuget 包,其中包含每个模块的模型(等)的源代码,而不是编译的 dll。
最佳答案
您可以在核心程序集中构建一些基础设施,这些基础设施将发现模块中的实体并将它们注册到单一上下文。每个实体必须具有派生自 EntityTypeConfiguration<>
的类(或 ComplexTypeConfiguration<>
用于复杂类型)将描述映射。
有了映射类后,您可以使用某个模块接口(interface)为每个模块收集所有映射类,或者使用反射来浏览程序集并创建映射类的实例。 DbModelBuilder
可以使用这些类。直接(在 OnModelCreating
中或直接)。
Also I need to be able to work with migrations.
我不确定迁移是否为此做好了准备,因为它有一些先决条件:
DbMigration
派生类(或新版本的类)DbMigration
派生类(或新版本的类)这意味着您为核心设置了特殊的迁移集,并且为每个模块设置了一个迁移集。每个迁移集都在单独的程序集中定义 - 这可能是潜在的问题。我自己没有尝试过,所以我不知道 EF 迁移是否可以处理这个问题 - 我特别针对您真正需要模块化系统的场景,其中模块可以随着时间的推移添加或删除,因此您需要两个安装(
Up
方法)和卸载(Down
方法)。迁移的问题在于,如果你开发了人们可以添加自定义模块的平台,你永远不知道它们是否会破坏你的核心。
关于asp.net-mvc - EF 代码优先模块化设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9522534/