gpt4 book ai didi

entity-framework - 替换父项并将子项链接到它后保存 ObjectContext 时出错

转载 作者:行者123 更新时间:2023-12-03 17:03:41 25 4
gpt4 key购买 nike

在我的应用程序中,该界面允许用户在 Entity Framework 模型中创建和删除实体。所有更改都添加到 ObjectContext,并且仅在用户选择“保存”时保存。

我的问题最好通过以下简单示例提出:

我在两个实体类型之间有一个外键关系,我将在这里称为 ParentChild。 SQLite 中的数据库声明如下:

CREATE TABLE Parents   (ID INTEGER PRIMARY KEY);

CREATE TABLE Children
(
ID INTEGER PRIMARY KEY,
ParentID INTEGER NOT NULL
CONSTRAINT FK_ChildrenToParents REFERENCES [Parents](ID)
ON DELETE CASCADE ON UPDATE CASCADE
)

然后我在该数据库上构建一个 Entity Framework 模型,并对它执行以下操作(参见下面的代码):

  1. 创建一个父级
  2. 保存
  3. 删除父级
  4. 创建一个新的 Parent 与原来的 ID 号相同
  5. 创建一个 Child 并为其提供新的 Parent 的 ID 号
  6. 保存(失败)
demoDBEntities entities = new demoDBEntities();

Parent originalParent = new Parent { ID = 1 };
entities.Parents.AddObject(originalParent);

entities.SaveChanges(); // First Save

entities.Parents.DeleteObject(originalParent);

Parent newParent = new Parent { ID = 1 };
entities.Parents.AddObject(newParent);
Child newChild = new Child { ID = 2, ParentID = 1 };
entities.Children.AddObject(newChild);

entities.SaveChanges(); // Second Save

第二次调用 SaveChanges() 时出现以下错误:

“无法插入或更新实体,因为‘demoDBModel.FK_Children_0_0’关系的主体端已删除。”

问题似乎是 Entity Framework 将新的 Child 项链接到 originalParent 项,然后删除并替换为 newParent项目。这听起来可能很自负,但在我的申请中却很自然地发生了。

有什么方法可以解决这个问题吗?

PS:我知道重复使用数据库条目的 ID 号是不好的做法 - 但是,在我的例子中,ID 号是 Assets 号,理论上可以重复使用。也就是说,如果客户端创建了一个错误的 Parent,然后删除它,重新创建它,然后创建 Child 项,通常会发生上述情况。

最佳答案

除了设置外键属性 ParentID 之外,您还可以尝试设置一个导航属性(您必须至少有一个)并且只调用一次 AddObject将完整的对象图添加到上下文中:

或者:

//...
entities.Parents.DeleteObject(originalParent);

Child newChild = new Child { ID = 2 };
Parent newParent = new Parent { ID = 1, Children = new List<Child>{ newChild } };
entities.Parents.AddObject(newParent);

entities.SaveChanges();

或者:

//...
entities.Parents.DeleteObject(originalParent);

Parent newParent = new Parent { ID = 1 };
Child newChild = new Child { ID = 2, Parent = newParent };
entities.Children.AddObject(newChild);

entities.SaveChanges();

关于entity-framework - 替换父项并将子项链接到它后保存 ObjectContext 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15006171/

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