避免在继承上下文时从基础 EF Core 3.0 模型重新建模对象

Avoid re-modelling objects from a base EF Core 3.0 model when inherritting the context

目标

我的目标是创建 DbContext 的层次结构,每个 DbContext 位于不同的程序集中。正确建立所需的任何引用,以便 C# 代码成功编译。

场景

假设我创建了一个数据库上下文,例如DbChild,继承自基础,比如 DbBase

基础上下文中有一些在 OnModelCreating() 中定义的实体。创建这些实体的迁移并成功应用于数据库,因此数据库模式包含映射的 DbBase 模型。

不用说 DbChild 使用完全相同的连接字符串,因此使用相同的数据库(我尝试了多种提供连接字符串的方法,最后一种方法直接在 optionsBuilder.UseSqlServer("<conection string>"); 中指定) .

实际结果

但是,为子上下文创建迁移会将基础模型作为子上下文的一部分,这会导致数据库中出现重复的 SQL 对象。

要求的结果

需要“clean”迁移,包括来自子上下文的 SQL 对象(EF 实体)。

有什么实现方法吗?

提前致谢。

PS:在 OnModelCreating() 中调用 Ignore(...) 可能是一种解决方法,但它需要 DbBase 中引用的所有内容在 DbChild 中引用,这不是一个选项。

PS2:在创建子模型时完全忽略基础模型也不是一种选择 - 子模型使用基础中的实体作为关系。

编辑:快照<ContextName>ModelSnapshot.cs包含模型的"copy",每次迁移都会更新。这是每次迁移开始的地方。然而,在复杂的模型中,从现有数据库中以编程方式生成快照文件而不是复制、更改命名空间、重命名以反映上下文名称等,这会容易得多,而且更重要——安全.

所以,问题可以转化为“如何在应用第一次迁移时生成数据库快照?”。

欢迎提出任何想法。

创建新的派生上下文时,在设置数据库连接字符串之后但在将任何派生类型添加到上下文之前,您应该创建一个迁移来保存预先存在的基本上下文类型的快照。

在 EF6 中,这将通过使用 Add-Migration PreExisting –IgnoreChanges 创建迁移来完成。这会产生一个迁移,其中内部模型包含一个更新的快照,但是迁移的 UpDown 方法是空的。

我不知道 EF Core 当前是否支持 -IgnoreChanges 开关。根据 ,另一种方法是在创建迁移后手动清除 Up/Down 方法。

仅在创建第一个快照迁移后,才开始将其他实体添加到派生上下文并创建迁移以将它们添加到数据库等。