实体框架代码首先出现问题

时间:2011-11-01 16:18:26

标签: .net entity-framework

我的实体类是这样的:

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,这会导致异常,因为它们已经在其中。这不应该发生。

我该如何解决这个问题?

由于

1 个答案:

答案 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,并在bc中的关系中同时使用。

如果由于某种原因需要创建两个上下文,则必须重新附加在第一个上下文中插入的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();
}