gpt4 book ai didi

c# - 继承上下文时避免从基本 EF Core 3.0 模型重新建模对象

转载 作者:行者123 更新时间:2023-12-04 10:58:23 24 4
gpt4 key购买 nike

目标

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

情景

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

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

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

实际结果

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

必填结果

一个“ 清理 ”迁移,包括 仅限 需要来自子上下文的 SQL 对象(EF 实体)。

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

提前致谢。

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

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

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

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

欢迎任何想法。

最佳答案

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

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

我不知道 EF Core 是否支持 -IgnoreChanges当前切换。根据What is the equivalent of the -IgnoreChanges switch for entity-framework core in CLI? ,另一种方法是在创建迁移后手动清除 Up/Down 方法。

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

关于c# - 继承上下文时避免从基本 EF Core 3.0 模型重新建模对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59026445/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com