C# 当固有上下文时,避免从基础EF Core 3.0模型重新建模对象
目标 我的目标是创建DBContext的层次结构,每个DBContext都位于不同的程序集中。所需的任何引用都会正确建立,以便C代码能够成功编译 场景 比如说,我创建了一个数据库上下文,例如,从基本上下文继承而来的C# 当固有上下文时,避免从基础EF Core 3.0模型重新建模对象,c#,entity-framework,inheritance,dbcontext,C#,Entity Framework,Inheritance,Dbcontext,目标 我的目标是创建DBContext的层次结构,每个DBContext都位于不同的程序集中。所需的任何引用都会正确建立,以便C代码能够成功编译 场景 比如说,我创建了一个数据库上下文,例如,从基本上下文继承而来的DbChild,比如说DbBase 基本上下文有一些在OnModelCreating()中定义的实体。创建了这些实体的迁移并成功应用于数据库,因此db模式包含映射的DbBase模型 不用说,DbChild使用了非常相同的连接字符串,因此使用了相同的数据库(我尝试了多种方法来提供连接字符
DbChild
,比如说DbBase
基本上下文有一些在OnModelCreating()
中定义的实体。创建了这些实体的迁移并成功应用于数据库,因此db模式包含映射的DbBase模型
不用说,DbChild
使用了非常相同的连接字符串,因此使用了相同的数据库(我尝试了多种方法来提供连接字符串,最后一种方法直接在optionsBuilder.UseSqlServer(“”;
)中指定)
实际结果
但是,为子上下文创建迁移时,会将基础模型作为子模型的一部分,这会导致数据库中出现重复的SQL对象
要求的结果
需要从子上下文进行“clean”迁移,只包括SQL对象(EF实体)
有什么办法可以做到这一点吗
提前谢谢
PS:在OnModelCreating()
中调用Ignore(…)
可能是一种解决方法,但它需要在DbBase
中引用的所有内容在DbChild
中引用,而这不是一个选项
PS2:完全忽略基础模型,同时创建子模型也不是一个选项-子模型使用基础实体作为关系
编辑:快照modelsnashot.cs
包含模型的“副本”,该副本随每次迁移而更新。这是每次迁移的起点。然而,在复杂的模型中,让快照文件从现有数据库中以编程方式生成,而不是复制、更改名称空间、重命名以反映上下文名称,这将更容易,更重要的是更安全
因此,问题可能会转化为“应用第一次迁移时如何生成数据库快照?”
欢迎任何想法。在创建新的派生上下文时,在设置DB连接字符串之后,但在将任何派生类型添加到上下文之前,应创建一个迁移,以保存先前存在的基本上下文类型的快照 在EF6中,这可以通过创建一个迁移来完成,其中
addmigration PreExisting–IgnoreChanges
。这将生成一个迁移,其中内部模型包含一个更新的快照,但迁移的Up
和Down
方法为空
关于EF Core当前是否支持-IgnoreChanges
开关,我没有最新的信息。根据,另一种方法是在创建迁移后手动清除向上/向下方法
只有在创建了第一次快照迁移之后,才能开始向派生上下文添加其他实体,并创建迁移以将它们添加到数据库中等。作为使用新上下文的第一个操作,请执行
添加迁移之前存在的–忽略更改。然后开始向子上下文添加特定的内容。仅当父模型从未更改或您为每个父项更改在子项中添加了新的“忽略更改”迁移时才有效。@grek40没问题。自从我检查过之后,我正要写同样的东西。这就是为什么这对我来说是显而易见的。无论如何,我删除了这条评论,因为它没有带来任何新的价值。我认为你的评论应该是问题的答案-谢谢!是的,EF Core(3.0)似乎不支持IgnoreChanges开关。应该使用不带OnModelCreating的子代DbContext来生成基本快照迁移,然后手动清理向上/向下到{}的数据。然后可以添加任何新实体以及新的“干净”迁移。