我的实体类是这样的:
public class A{
[Key]
string Name;
B DefaultB;
ICollection<B> Bs;
}
public class B{
[Key]
int Key;
}
public class C{
[Key]
string Key;
A MyA;
B MyB;
public C(A a,B b){
MyA=a;
MyB=b;
}
}
public class MyDbContext:DbContext{
public DbSet<A> As
public DbSet<B> Bs
public DbSet<C> Cs
}
测试代码如下:
main(){
A a=new A();
B b=new B();
a.addB(B);
MyDbContext m=new MyDbContext();
m.As.Add(a);
m.SaveChanges();
C c=new C(a,b);
m.Cs.Add(c);
m.SaveChanges();
}
问题是当我将c添加到上下文时,它会尝试在上下文中再次添加a和b,这会导致异常,因为它们已经在其中。这不应该发生。
我该如何解决这个问题?
由于
答案 0 :(得分:0)
如果你在一个上下文中完成所有操作,最后只需要一个SaveChanges
:
A a=new A();
B b=new B();
a.addB(B);
using (MyDbContext m = new MyDbContext())
{
m.As.Add(a);
C c=new C(a,b);
m.Cs.Add(c);
m.SaveChanges();
}
EF只会创建一个A
和一个B
,并在b
和c
中的关系中同时使用。
如果由于某种原因需要创建两个上下文,则必须重新附加在第一个上下文中插入的entite,以避免在数据库中进行第二次INSERT和复制:
A a=new A();
B b=new B();
a.addB(B);
using (MyDbContext m = new MyDbContext())
{
m.As.Add(a);
m.SaveChanges();
}
// ...
using (MyDbContext m2 = new MyDbContext())
{
m2.As.Attach(a);
m2.Bs.Attach(b);
C c=new C(a,b);
m2.Cs.Add(c);
m2.SaveChanges();
}