首页 > 解决方案 > 继承上下文时避免从基本 EF Core 3.0 模型重新建模对象

问题描述

目标

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

场景

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

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

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

实际结果

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

所需结果

需要从子上下文中包括 SQL 对象(EF 实体)的“干净”迁移。

任何想法如何实现这一目标?

提前致谢。

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

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

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

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

欢迎任何想法。

标签: c#entity-frameworkinheritancedbcontext

解决方案


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

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

我不知道 EF Core-IgnoreChanges目前是否支持该开关。根据CLI 中实体框架核心的 -IgnoreChanges 开关等效于什么?,另一种方法是在创建迁移后手动清除 Up/Down 方法。

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


推荐阅读