2011-11-01 219 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(); 
}