我在某些类型A,B,C和X之间有以下关系:
A->B->X
|->C->X
|->X
现在假设我想在数据库中添加一个新的A,并将其与B,C和X的现有实例相关联。
我正在做的是:
using (Context context = new Context())
{
context.As.Attach(A);
context.As.Add(A);
context.SaveChanges();
}
它似乎有用,但我不确定它,因为Attach通常用于附加现有实例。
此替代方案不起作用:
using (Context context = new Context())
{
context.Bs.Attach(A.B);
context.Cs.Attach(A.C);
context.As.Add(A);
context.SaveChanges();
}
因为在这种情况下X被连接两次(A.B.X和A.C.X)并且实体框架抛出异常:
System.InvalidOperationException:
An object with the same key already exists in the ObjectStateManager.
The ObjectStateManager cannot track multiple objects with the same key.
使用我的解决方案是否有意义,或者有更好的方法吗?
答案 0 :(得分:1)
是的,您的解决方案有意义 - 您已附加整个图表并仅将A
更改为Added
州。它也可以改写为:
using (Context context = new Context())
{
context.As.Attach(A);
context.Entry(A).State = EntityState.Added;
context.SaveChanges();
}
在某些复杂的情况下,以相反的顺序执行此操作也很有用 - 添加所有项目并更改所有现有项目的状态。