目标
我的目标是创建 DbContext 的层次结构,每个 DbContext 驻留在不同的程序集中。正确建立所需的任何引用,以便 C# 代码成功编译。
场景
假设我创建了一个数据库上下文,例如DbChild
,从基础继承,例如 DbBase
。
基础上下文有一些在 OnModelCreating()
中定义的实体。这些实体的迁移已创建并成功应用于数据库,因此数据库架构包含映射的 DbBase 模型。
不用说DbChild
使用完全相同的连接字符串,因此使用相同的数据库(我尝试了多种方法来提供连接字符串,最后一种方法直接在 optionsBuilder.UseSqlServer("<conection string>");
中指定它)。
实际结果
但是,为子上下文创建迁移会将基本模型作为子上下文的一部分,这会导致数据库中出现重复的 SQL 对象。
所需结果
需要进行“干净”迁移,其中仅来自子上下文的 SQL 对象(EF 实体)。
有什么想法可以实现这一目标吗?
提前致谢。
PS:调用Ignore(...)
在OnModelCreating()
可能是一种解决方法,但它需要 DbBase
中引用的所有内容引用DbChild
这不是一个选项。
PS2:在创建子模型时完全忽略基础模型也不是一种选择 - 子模型使用基础中的实体作为关系。
编辑:快照 <ContextName>ModelSnapshot.cs
包含模型的“副本”,该副本会随着每次迁移而更新。这是每次迁移开始的地方。然而,在复杂的模型中,更容易,更重要的是安全,从现有数据库中以编程方式生成快照文件,而不是复制、更改命名空间、重命名以反射(reflect)上下文名称等.
因此,问题可能会转化为“应用第一次迁移时如何生成数据库快照?”。
欢迎任何想法。
最佳答案
创建新的派生上下文时,在设置数据库连接字符串之后但在将任何派生类型添加到上下文之前,您应该创建一个迁移来保存预先存在的基本上下文类型的快照。
在 EF6 中,这可以通过使用 Add-Migration PreExisting –IgnoreChanges
创建迁移来完成。这会产生一个迁移,其中内部模型包含更新的快照,但迁移的 Up
和 Down
方法为空。
我目前不了解 EF Core 是否支持 -IgnoreChanges
开关。根据What is the equivalent of the -IgnoreChanges switch for entity-framework core in CLI? ,另一种方法是在创建迁移后手动清除向上/向下方法。
仅在创建第一个快照迁移后,才开始向派生上下文添加其他实体并创建迁移以将它们添加到数据库等。
关于c# - 继承上下文时避免从基本 EF Core 3.0 模型重新建模对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59026445/