[英]Entity Framework - How To Configure One-To-Many Relationship Navigation Properties Correctly
[英]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來獲取Customer
的CustomerType
。
現在,我正在查看另一個顯示相同類型關系的資源:
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; }
}
看起來幾乎一樣,除了:
在此示例中, Standard
類(相當於my CustomerType
)具有一個導航屬性,該屬性可以返回到Teachers
的集合,而我的第一個示例沒有。 如果要獲得給定標准的所有教師的清單,這是否方便,還是需要正確建立關系?
第二個示例中的屬性被標記為virtual
屬性,而第一個示例中的則未標記為virtual
屬性-似乎最佳實踐是將nav屬性設置為虛擬屬性,但是是否有您不想這樣做的原因?
如果重要的話,我正在使用MVC5和EF6,我只想知道一個例子是正確的,一個例子是錯誤的,還是到達同一個地方的兩種樣式。
謝謝!
導航屬性是為了使程序員更容易查詢。 您的示例基本相同,不同之處在於在Standard
您可以通過查詢訪問Teachers
,而在CustomerType
您不能使用此CustomerType
訪問Customers
,因為您沒有將其作為導航屬性。 但是,您始終可以在“ Customer Type
包括List<Customer> Customers
。
為了延遲加載,最好將virtual添加到導航屬性。
這取決於您的需要,如果您永遠不必獲取導航屬性,而只需要一個外鍵以保證數據完整性,那么您只需添加一個整數並將其標記為外鍵即可。 例如:您可以僅擁有一個CustomerTypeId
,而不是擁有一個CustomerType
實例。
至於virtual
關鍵字,如果要在DBContext
啟用延遲加載,可以添加它,因為EF會生成從模型類繼承的代理類,並且它會覆蓋虛擬屬性以添加所需的邏輯來延遲加載導航屬性。
如果禁用了延遲加載,則無需將任何屬性標記為virtual
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.