EF4 c# 以 1:n 更新嵌套对象
本文关键字:更新 嵌套 对象 EF4 | 更新日期: 2023-09-27 18:32:40
我有一个嵌套的 EF 对象挂在其父对象上。它有 1:n 关系
[父级]-[n..儿童]
嵌套对象子项是动态的,将通过 GUI 进行更新。
我在数据库上更新它时遇到问题。
错误消息:具有相同键的对象已存在于对象状态管理器中。对象状态管理器不能使用相同的键跟踪多个对象。
这是第二个版本的问题。 我对用于决定 preExists 的 if 块进行了更正
提前感谢您的帮助
坐鸭
主要更新
void MainUpdate
{
var context = new FamilyEntities();
parent = getParentFromGui();
parent.UpdateRelatedEntities(context);
context.dispose();
}
对象父级已在 Gui 中更新
parent getParentFromGui()
{
parent myParent = parentBindingSource.DataSource as parent;
foreach(child c in childrenBindingSource)
{
myParent.children.Add(c);
}
return myParent
}
修改的更新相关实体
public static void UpdateRelatedEntities(this parent entity, FamilyEntities context)
{
if (entity == null) return;
var res = context.parent.Where(x => x.uid_parent == entity.uid_parent);
var rec = res.FirstOrDefault();
context.parent.Attach(rec);
context.parent.ApplyCurrentValues(entity);
foreach (var c in entity.children)
{
bool preExist = context.children.FirstOrDefault(x => x.child_uid == c.child_uid);
if (preExist != null)
{
context.children.Attach(obj);
context.children.ApplyCurrentValues(c);
}
else
{
// This Part throw ERROR
context.children.AddObject(c);
}
}
context.SaveChanges();
}
我做错了什么?
Tx很多!
试试这个语法
foreach (var c in entity.children)
{
var preexistingChildren = context.children.FirstOrDefault(x => x.child_uid == c.child_uid)
if (preexistingChildren != null)
{
context.children.Attach(obj);
context.children.ApplyCurrentValues(c);
}
else
{
// ERROR
context.children.AddObject(c);
}
}
目前还不清楚 *context.shaft_section* 是什么,但从逻辑上讲,你的代码有问题:你实际上并没有检查元素是否存在于上下文中.children,你的 isExists 来自其他检查。
这很容易出现像您遇到的错误。
编辑后
现在你只是将集合与元素进行比较:context.children.equals(c)总是假的
第二次编辑后这一行:
context.parent.Attach(rec);
将对象或对象图(含义 - 所有子项)附加到上下文(请参阅 MSDN)。因此,当您尝试这样做时,您所有的孩子都已经属于上下文
context.children.AddObject(c);
因此出现错误 - 您正在尝试添加同一对象两次。