在同时修改和添加子行时,我遇到了一些问题。我用的是答案中的技巧:stackoverflow.com/questions/5557829/...。
问题出在以下代码中:
public void EditReport(tbl_inspection inspection)
{
foreach (var roll in inspection.tbl_inspection_roll)
{
container.tbl_inspection_roll.Attach(roll);
container.ObjectStateManager.ChangeObjectState(roll, (roll.id_inspection_roll == 0) ? EntityState.Added : EntityState.Modified);
}
container.SaveChanges();
}
我总是至少有一行要更新。当我有一行要添加时,它工作得很好,问题是当我试图同时添加多行时,显示了众所周知的错误:
在ObjtStaseMeMaGER中已经存在一个具有相同密钥的对象。
objectstatemanager无法跟踪具有相同
钥匙。
感觉好像我错过了什么…
最佳答案
我认为你需要把修改过的和添加的分开。在您链接到Ladislav的问题中,有以下代码作为示例:
if (myEntity.Id != 0)
{
context.MyEntities.Attach(myEntity);
context.ObjectStateManager.ChangeObjectState(myEntity, EntityState.Modified);
}
else
{
context.MyEntities.AddObject(myEntity);
}
context.SaveChanges();
我认为使用attach而不是addobject是导致错误的原因。
编辑:请对附加零件尝试以下操作:
var r = new tbl_inspection_roll { id_inspection_roll = roll.id_inspection_roll };
container.tbl_inspection_roll.Attach(r);
container.Entry(r).CurrentValues.SetValues(roll);