2011-11-01 134 views
1

我的实体类是这样的:实体框架代码首先愁楚

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

不应该有例外。 'a'和'b'只存在一次(每个实体我只看到一个'new''''''''''''''''''''''''''''''''''''''''''''')你会得到什么例外? – Slauma

+0

我得到一个DatabaseUpdate异常,因为A的主键已经在数据库中。 (数据库配置为DropCreateAlways。) – Fritsie

+0

上面的代码会得到一个* Update *异常?有没有显示的SaveChanges调用? (你可以编辑你的问题来澄清这一点。) – Slauma

回答

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中的关系。

如果你需要 - 由于某种原因 - 创建两个上下文,你必须重新安装你在第一个方面插入的entites以避免在数据库中的第二个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(); 
}