gpt4 book ai didi

c# - 多个插入需要设置 Id 属性?

转载 作者:太空宇宙 更新时间:2023-11-03 10:45:26 26 4
gpt4 key购买 nike

将 Entity Framework 6.1.0 与 SQL Server 2008R2 结合使用,我无法在单个工作单元中插入相同类型的多条记录(没有 hack),而且我似乎找不到我做错了什么?

我正在与 Groups 和 Nations 合作,其中每个 Nation 都属于一个 Group,而一个 Group 有一组 Nations。当我想将 3 个国家添加到同一个组时,如下所示:

using (MyDBContext context = new MyDBContext())
{
List<Db.Group> groups = context.Groups.ToList();
Db.Group groupH = groups.First(grp => grp.Name == "H");

Db.Nation nation1 = new Db.Nation() { Code = "NA1", Name = "Nation 1" };
//nation1.Id = 1001;
nation1.Group = groupH;
nation1.GroupId = groupH.Id;
nation1.GroupOrdinal = 5;
context.Nations.Add(nation1);
Db.Nation nation2 = new Db.Nation() { Code = "NA2", Name = "Nation 2" };
//nation2.Id = 1002;
nation2.Group = groupH;
nation2.GroupId = groupH.Id;
nation2.GroupOrdinal = 6;
context.Nations.Add(nation2);
Db.Nation nation3 = new Db.Nation() { Code = "NA3", Name = "Nation 3" };
//nation3.Id = 1003;
nation3.Group = groupH;
nation3.GroupId = groupH.Id;
nation3.GroupOrdinal = 7;
context.Nations.Add(nation3);

groupH.Nations.Add(nation1);
groupH.Nations.Add(nation2);
groupH.Nations.Add(nation3);

context.SaveChanges();
}

...我收到一个 InvalidOperationException 告诉我:操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新的关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。

但是,当我取消注释为每个新国家分配主键值的 3 行(即 nation1.Id = 1001 等)时,插入工作没有问题吗?

请注意,数据库中与 Nation.Id 对应的列是一个 Identity(1, 1) 列,它使用此生成的值来插入新的 Nation 行:它忽略了我在代码中分配它们。
Entity Framework 似乎需要这个值(没有实际使用它),我认为这很奇怪。这应该没有必要,对吧?

那么,我做错了什么?

编辑 我还创建了一个简单的“引用”项目,其中只有 2 个实体试图隔离问题 - 当然,这个确实有效:')但是,当我比较 ObjectStateManager 的内容时(即 ((IObjectContextAdapter)context).ObjectContext.ObjectStateManager)引用项目和我的真实项目,我注意到其 _entriesWithConceptualNulls 成员的内容有所不同:

  • 在我的真实项目中,每个添加的国家都被添加到 _entriesWithConceptualNulls 集合中,这显然是实体集合有一个空的外键值,而他们不允许有一个(见 here )。
  • 在我的引用项目中,以及当我为每个新 Nation 分配一个 Id 值时,_entriesWithConceptualNulls 保持为空。

更令人惊讶的是,在我的实际项目中,当我只插入一个国家时,它也不需要具有 Id 值 - _entriesWithConceptualNulls 保持为空,并且插入工作正常。只有当我插入 2 或 3 个国家时,才需要 Id 值...

编辑 2 问题可能确实出在我正在使用的 .edmx 中:当我让 Visual Studio 从头开始​​生成一个新的 .edmx 时,代码在没有必须设置 ID。待续……

最佳答案

只需删除 groupH.Nations.Add(nation1); 部分(最后 3 行)。

你通常会做其中一件事情 - 当你设置国家集团(从关系的一方)时,一切都准备好了 - 从集团方面再次这样做似乎是两倍(我不记得最近这样做了,我希望 EF 能够处理这个问题而不报告重复项,但似乎并非如此)。

基本上都是同一个关系的一部分,只是它的不同方面,你不需要两者。

关于c# - 多个插入需要设置 Id 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23591538/

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