簡體   English   中英

闡明實體框架中的一對多導航屬性

[英]Clarification of one-to-many navigation properties in Entity Framework

我對網上看到的使用EF的一對多模型關系的示例相互沖突感到有些困惑。

我觀看的一個視頻設置了表之間的關系,如下所示:

public class CustomerType
{
    public int Id { get; set; }

    public string Name { get; set; }   
}

public class Customer
{
    public int Id { get; set; }

    public string Name { get; set; }

    public int CustomerTypeId { get; set; }

    public CustomerType CustomerType { get; set; }
}

因此,一個Customer只能有一個CustomerType ,但CustomerType可以被許多人使用Customers 這段代碼運行良好,我可以使用Include使用LINQ來獲取CustomerCustomerType

現在,我正在查看另一個顯示相同類型關系的資源:

public partial class Standard
{

    public int StandardId { get; set; }
    public string StandardName { get; set; }

    public virtual ICollection<Teacher> Teachers { get; set; }
}

public partial class Teacher
{
    public int TeacherId { get; set; }
    public string TeacherName { get; set; }

    public Nullable<int> StandardId { get; set; }

    public virtual Standard Standard { get; set; }
}

看起來幾乎一樣,除了:

  1. 在此示例中, Standard類(相當於my CustomerType )具有一個導航屬性,該屬性可以返回到Teachers的集合,而我的第一個示例沒有。 如果要獲得給定標准的所有教師的清單,這是否方便,還是需要正確建立關系?

  2. 第二個示例中的屬性被標記為virtual屬性,而第一個示例中的則未標記為virtual屬性-似乎最佳實踐是將nav屬性設置為虛擬屬性,但是是否有您不想這樣做的原因?

如果重要的話,我正在使用MVC5和EF6,我只想知道一個例子是正確的,一個例子是錯誤的,還是到達同一個地方的兩種樣式。

謝謝!

導航屬性是為了使程序員更容易查詢。 您的示例基本相同,不同之處在於在Standard您可以通過查詢訪問Teachers ,而在CustomerType您不能使用此CustomerType訪問Customers ,因為您沒有將其作為導航屬性。 但是,您始終可以在“ Customer Type包括List<Customer> Customers

為了延遲加載,最好將virtual添加到導航屬性。

MSDN

這取決於您的需要,如果您永遠不必獲取導航屬性,而只需要一個外鍵以保證數據完整性,那么您只需添加一個整數並將其標記為外鍵即可。 例如:您可以僅擁有一個CustomerTypeId ,而不是擁有一個CustomerType實例。

至於virtual關鍵字,如果要在DBContext啟用延遲加載,可以添加它,因為EF會生成從模型類繼承的代理類,並且它會覆蓋虛擬屬性以添加所需的邏輯來延遲加載導航屬性。

如果禁用了延遲加載,則無需將任何屬性標記為virtual

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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