2013-05-18 146 views
1

我有2個實體,假設它們A和B之間的關係是多到很多,所以我有另一個實體,假設C.

EF 4.1代碼第一次:多對多

列於表答:
-Id(PK) - 爲表B> int類型由數據庫生成
-PropertyA1
-PropertyA2
-PropertyA3

色譜柱:
-Id(PK) - > int類型的數據庫生成
-Description

列於表C(對於這個表,我不知道這是否是最好添加由數據庫生成的ID爲以前的一個額外的列表):被插入於種子方法
-IDA(PK和也外鍵實體A)
-IdB(PK和也外鍵實體B)

表B具有固定值(overrided )。其條目是象下面這樣:
Id描述
1 「一些描述1」
2 「一些說明2」
3 「一些說明3」

從一種形式,用戶介紹有關的信息表A(propertyA1,...,propeprtyA3),然後單擊按鈕將數據保存到數據庫。

一旦用戶點擊按鈕的形式將數據保存到數據庫中,我首先做到以下幾點:

A a = new A(){ PropertyA1=something_1, 
        PropertyA2=something_2, 
        PropertyA3=something_3 }; 

    context.A.Add(a); 
    context.SaveChanges(); 

那麼作爲更改保存到數據庫後,我已經通過數據庫生成的ID(我之前還沒有ID保存到數據庫),也就是a.Id,現在我可以繼續做添加到表C中的條目:

B b = this.ObtainAppropriateB(); 
    C c = new C(){ IdA = a.Id, 
       IdB = b.Id }; 

    context.C.Add(c); 
    context.SaveChanges(); 

我的問題是:
1)我不知道a.Id以前做context.SaveChanges af ter.A.Add(a)因爲它是由數據庫生成的。
2)如果在context.C.Add(c)之後context.SaveChanges失敗,我如何回滾以及以前的工作?
context.A.Add(a);
context.SaveChanges();

我不能做以下的,因爲我沒有a.Id以前做的SaveChanges:

A a = new A(){ PropertyA1=something_1, 
        PropertyA2=something_2, 
        PropertyA3=something_3 }; 

    context.A.Add(a); 
    B b = this.ObtainAppropriateB(); 
    C c = new C(){ IdA = a.Id, 
        IdB = b.Id }; 

    context.C.Add(c); 

    context.SaveChanges(); <--- I call it once to persist changes to database 

如何解決這個問題?

+0

你是說A和B之間的關係是'多對多'? – Komengem

+0

是的,問題是什麼? – user1624552

回答

5

這不是您使用Entity Framework進行多對多關係的方式。

首先,你不應該有一個C實體模型,但是,實體AB而是集合屬性:

public class A 
{ 
    public int AId { get; set; } 
    public int PropertyA1 { get; set; } 
    public string PropertyA2 { get; set; } 
    public DateTime PropertyA3 { get; set; } 

    public ICollection<B> Bs { get; set; } 
} 

public class B 
{ 
    public int BId { get; set; } 

    // ... 

    public ICollection<A> As { get; set; } 
} 

從集合EF能夠弄清楚,我們的關係很多,TO-很多,並且需要鏈接表(C)。您可以使用Fluent API定義映射詳細信息。

其次,一旦您擁有導航集合,您就不需要關心Ids。你只要建立必要的關係,對象圖,並將其保存到數據庫:

A a = new A() { PropertyA1 = something_1, 
       PropertyA2 = something_2, 
       PropertyA3 = something_3 }; 
a.Bs = new List<B>(); 

B b = this.ObtainAppropriateB(); // must use same context instance 

a.Bs.Add(b); 

context.A.Add(a); 
context.SaveChanges(); 

這將創建一個新的A和插入ab之間的關係行插入鏈接表。

+0

謝謝,它的工作原理。正如卡洛斯公司上面所述,我在考慮數據庫術語而不是模型術語。我仍然是EF代碼新手......感謝所有人! – user1624552

1

我認爲問題在於你用數據庫術語而不是模型術語思考。您應該忘記表C,因爲該表將由數據庫生成。您應該在A類中獲得B的集合,並在B類中收集A的集合。然後指定多對多關係。如果您將B添加到A,並保存您的上下文,則會將相應的數據添加到表C.

+0

你是對的,我在考慮數據庫術語而不是模型術語。我仍然是EF代碼新手......感謝所有人! – user1624552