我在我的代码中偶然发现了一个奇怪的错误.以前哪个工作,但现在有时工作.
我正在使用EF6来编辑具有某种关系的实体.不编辑我'附加'它们的关系(参见示例代码).
public void EditA(A ThisIsA, B ThisIsB)
{
using (var Context = new LDZ_DEVEntities())
{
Context.As.Attach(ThisIsA);
var b = Context.Bs.FirstOrDefault(x => x.BId == ThisIsB.BId);
//var b = Context.Bs.Find(ThisIsB.BId);
if (b != null)
Context.Bs.Attach(b);
else
b = ThisIsB;
if (b.C != null)
Context.Cs.Attach(b.C);
ThisIsA.Bs.Add(b);
Context.SaveChanges();
}
}
Run Code Online (Sandbox Code Playgroud)
我编辑了名字以保持简单.
以下行
Context.Cs.Attach(b.C);
Run Code Online (Sandbox Code Playgroud)
抛出此错误:
附加类型为"C"的实体失败,因为相同类型的另一个实体已具有相同的主键值.如果图中的任何实体具有冲突的键值,则在使用"附加"方法或将实体的状态设置为"未更改"或"已修改"时,可能会发生这种情况.这可能是因为某些实体是新的并且尚未收到数据库生成的键值.在这种情况下,使用"添加"方法或"已添加"实体状态来跟踪图形,然后根据需要将非新实体的状态设置为"未更改"或"已修改".
引入此行是因为所有C实体都是静态实体.我从不想要创建一个C. 如果我删除此行,每次我将A添加到A; 创建了一个C. 这是不可取的.
额外信息:
A有一个B的
B 列表有一个C.
在我的软件中的多个位置调用此EditA()方法.仅在循环(导入)中调用方法时才会出现此错误.在处理第一条记录时没有问题.但是我在第一个记录之后得到了记录中的错误.
我已经阅读了这些问题和答案,但它们并不适合我: