Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当固有上下文时,避免从基础EF Core 3.0模型重新建模对象_C#_Entity Framework_Inheritance_Dbcontext - Fatal编程技术网

C# 当固有上下文时,避免从基础EF Core 3.0模型重新建模对象

C# 当固有上下文时,避免从基础EF Core 3.0模型重新建模对象,c#,entity-framework,inheritance,dbcontext,C#,Entity Framework,Inheritance,Dbcontext,目标 我的目标是创建DBContext的层次结构,每个DBContext都位于不同的程序集中。所需的任何引用都会正确建立,以便C代码能够成功编译 场景 比如说,我创建了一个数据库上下文,例如,从基本上下文继承而来的DbChild,比如说DbBase 基本上下文有一些在OnModelCreating()中定义的实体。创建了这些实体的迁移并成功应用于数据库,因此db模式包含映射的DbBase模型 不用说,DbChild使用了非常相同的连接字符串,因此使用了相同的数据库(我尝试了多种方法来提供连接字符

目标

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

场景

比如说,我创建了一个数据库上下文,例如,从基本上下文继承而来的
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来生成基本快照迁移,然后手动清理向上/向下到{}的数据。然后可以添加任何新实体以及新的“干净”迁移。