簡體   English   中英

我要在依賴項或委托人上的兩個實體之間定義關系嗎?

[英]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外鍵。 如果沒有指定BarBaz可以存在。

我在哪里定義這些關系? 我指的是在哪里使用Fluent API時,這些關系是相對於哪個實體定義的? 也許要更清楚一點,如果我使用流暢的API和EntityTypeConfiguration類進行綁定,這些對象將定義在哪個實體中?

為什么我很困惑的一個例子是,因為我看到這樣的回答這一個是說,一個對一個應該與類中定義virtual 因此,在這些實體中, BazBar之間的可選一對一關系為:

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

至於您的示例中FooBar之間的其他關系, Foo有一組Bars但是Foo只有一個Bar因此外鍵在Bar EF默認情況下會這樣做。

從屬獲得引用主體密鑰的外鍵。 當一對一時,該外鍵也是依賴項的主鍵,但是EF無法確定哪個是哪個,這就是為什么在指定錯誤之前會得到錯誤。

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

當您在類中使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM