我的数据库模型(有时称为“context“)在启动时根据安装的服务和/或插件动态组装。插件和服务通过我的 IoC 容器导出它们的模型定义片段,应用程序核心会在启动时拾取它们并运行它们。DbContext.OnModelCreating
方法被调用。
问题是:我可以(以及如何)通过此设置使用 Code First 迁移?
(下面是有关我尝试过的内容以及具体问题的更多信息)
在我之前的项目中,数据库是从一些旧代码继承的,因此我们无论如何都无法使用任何 Code First 数据库生成内容。我们只是保留了一长串增量脚本,并在部署时手动执行它们(这是一个单主机类型的项目)。
现在我正在开始一个新项目,这一次,数据库是全新的,可供 Code First 使用。最初,我对 Code First 迁移感到非常兴奋,这似乎是一条可行的道路。直到我真正尝试过。很明显,由于缺乏明确定义,最初的尝试失败了DbContext
在我的项目中。
到目前为止,看起来唯一可行的选择是手动编码迁移,我对此非常满意。然而,事实证明这并不只是创建几个继承自的类那么简单DbMigration
.
经过对一个小型测试项目的一些实验后,我发现迁移自动生成器添加了一个实现IMigrationMetadata
,除其他外,其中包含我的模型的哈希值作为Source
and Target
特性。据推测,该散列随后用于识别从数据库的“当前”状态(如记录在__MigrationHistory
表)到代码中模型定义的最新状态。这完全有道理,但是……
当然,我不知道从哪里获取模型的哈希值,这使我无法实现IMigrationMetadata
关于我的迁移。
另一方面,我看到元数据接口不包含在DbMigration
类本身,这让我认为它可能是可选的。由此可见,迁移实际上可以在没有哈希值的情况下进行,但问题是 - 如何进行?
我在互联网上找到的所有信息都只是简单、非常基础的教程。没有有关如何手动创建迁移(以及是否支持)的信息。没有关于它实际如何工作以及如何扩展它的文档。而且从外面看也不是很明显。
我现在准备诉诸 ILSpy,但整个 EF 非常复杂,我担心我可能无法在合理的时间内找到我需要的东西。