2013-10-25 43 views
2

當使用實體框架時,我對我需要在兩個實體之間定義關係的位置感到困惑。我覺得每當我尋找例子時,我最終都會從兩個不同的角度找到同一事物的例子 - 依賴→本金,以及本金→依賴。我是否定義了依賴關係或主體上兩個實體之間的關係?

考慮下列實體:

class Foo 
{ 
    public int Id { get; set; } 
    public virtual ICollection<Bar> Bars { get; set; } 
} 

class Bar 
{ 
    public int Id { get; set; } 
    public Foo Foo { get; set; } 
    public virtual Baz { get; set; } 
} 

class Baz 
{ 
    public int Id { get; set; } 
    public Bar Bar { get; set; } 
} 

我們這裏有幾種情況。 Foo有許多指向它的BarBaz有一個可選的外鍵BarBaz可以存在沒有Bar指定。

我在哪裏定義這些關係?在哪裏,我的意思是當使用流利的API時,哪個實體將這些關係定義爲關係?也許更清楚一點,如果我使用流暢的API和綁定類,那麼這些實體會在哪些實體中定義?

爲什麼我很困惑的一個例子是因爲我看到像this one這樣的答案,表示應該在類中定義與virtual一對一的答案。因此,在這些實體中,可選一到一個BazBar之間會或類似的東西:

modelBuilder.Entity<bar>() 
      .HasOptional(f => f.Baz) 
      .WithRequired(s => s.Bar); 

回答

2

我覺得你被virtual關鍵字混淆。我確實試圖在你鏈接的頁面上找到它,但它不在那裏。

virtual關鍵字讓實體框架覆蓋它在後臺創建並從Bar繼承的代理實體中的該屬性。當該屬性被訪問時,覆蓋將會進行數據庫調用,以延遲加載Baz

virtual關鍵字與關係的定義無關,如果您不想延遲加載,則不需要它。

定義主,當你映射:

modelBuilder.Entity<bar>() 
      .HasOptional(f => f.Baz). //Baz is dependent 
      .WithRequired(s => s.Bar);//Bar is principal 

modelBuilder.Entity<bar>() 
      .HasOptional(f => f.Bar). //Bar is dependent 
      .WithRequired(s => s.Baz);//Baz is principal 

至於在你的榜樣FooBar之間的其他關係,FooBars一個集合,但Foo只有一個Bar所以外鍵繼續Bar。英孚將默認這樣做。

依賴項獲取引用委託人密鑰的外鍵。當它是一對一時,該外鍵也是從屬的主鍵,但是EF無法確定哪個是哪個,這就是爲什麼在你指定它之前得到一個錯誤。

參考:http://msdn.microsoft.com/en-us/library/ee382827.aspx

2

當您使用EF正如你在類中定義你已經定義你的關係。 EF必須明白,當你在集合類

public virtual ICollection<Bar> Bars { get; set; }

定義你導航屬性要一對多關係的能力。

在另一方面,如果你添加一個集合到其他類

public virtual ICollection<Foo> Foos { get; set; }

EF會明白,你想許多到5月的關係

如果您添加的實例,同樣的事情也會發生類作爲其他類中的屬性,它將理解爲一對一(或零對一)關係。

虛擬關鍵字無關,與你的關係,如前面提到的,它關心的懶惰,預先加載