[英]Do I define a relationship between two entities on the dependent or the principal?
當使用實體框架時,我對於在兩個實體之間定義關系的位置感到困惑。 我覺得無論何時尋找示例,最終都會從兩個不同的角度找到同一事物的示例-從屬→主體,以及從主→依存。
給定以下實體:
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
有很多Bar
指向它。 Baz
有一個可選的Bar
外鍵。 如果沒有指定Bar
則Baz
可以存在。
我在哪里定義這些關系? 我指的是在哪里使用Fluent API時,這些關系是相對於哪個實體定義的? 也許要更清楚一點,如果我使用流暢的API和EntityTypeConfiguration
類進行綁定,這些對象將定義在哪個實體中?
為什么我很困惑的一個例子是,因為我看到這樣的回答這一個是說,一個對一個應該與類中定義virtual
。 因此,在這些實體中, Baz
和Bar
之間的可選一對一關系為:
modelBuilder.Entity<bar>()
.HasOptional(f => f.Baz)
.WithRequired(s => s.Bar);
我認為您對virtual
關鍵字感到困惑。 我確實嘗試在您鏈接到的頁面上找到它,但是它不存在。
virtual
關鍵字使Entity Framework可以在其在后台創建並繼承自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
至於您的示例中Foo
和Bar
之間的其他關系, Foo
有一組Bars
但是Foo
只有一個Bar
因此外鍵在Bar
。 EF默認情況下會這樣做。
從屬獲得引用主體密鑰的外鍵。 當一對一時,該外鍵也是依賴項的主鍵,但是EF無法確定哪個是哪個,這就是為什么在指定錯誤之前會得到錯誤。
當您在類中使用EF時,就已經定義了關系。 EF可以理解,當您在類的Collection中定義導航屬性時,
public virtual ICollection<Bar> Bars { get; set; }
您想要一對多的關系。
另一方面,如果您將集合添加到另一個類
public virtual ICollection<Foo> Foos { get; set; }
英孚將了解您希望許多人與您建立聯系
如果將一個類的實例作為屬性添加到另一個類中,將會發生同樣的事情,它將理解為一對一(或零對一)關系。
如前所述, virtual關鍵字與您的關系無關,它與懶惰,渴望加載有關
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.