我在我的代码中遇到了一个奇怪的错误。之前它是可以工作的,但现在有时候会出问题。
我正在使用EF6来编辑一些关联实体。 为了不编辑这些关系,我使用了'Attach'方法(请参见示例代码)。
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();
}
}
我已经简化了名称。
以下是该行:
Context.Cs.Attach(b.C);
抛出此错误:
附加类型为'C'的实体失败,因为另一个具有相同主键值的类型相同的实体已经存在。当使用“Attach”方法或将实体状态设置为“Unchanged”或“Modified”时,如果图中的任何实体具有冲突的键值,则可能会发生这种情况。这可能是因为某些实体是新的,尚未收到数据库生成的键值。在这种情况下,请使用“Add”方法或“Added”实体状态来跟踪图形,然后根据需要将非新实体的状态设置为“Unchanged”或“Modified”。
添加此行是因为所有的C实体都是静态实体。我永远不想创建C。如果我删除此行,每次我将B添加到A时,都会创建一个C。这是不可取的。
额外信息:
A拥有B的列表
B有一个C
我的软件中多个位置调用了此EditA()方法。只有在循环(导入)调用该方法时才会出现此错误。在处理第一条记录时没有问题。但是我在第一条记录之后的记录中遇到了错误。
我读过这些问题及其答案,但对我无效: