2016-05-12 22 views
0

以下是在Entity Framework中定義實體類的四種不同方法。有人能告訴我每種方法的工作方式有什麼不同,並推薦使用哪種方法?實體框架屬性它是如何工作的

// Approach 1 
public class User 
{ 
    public int Id { get; set; } 
    public Address Address { get; set; } 
} 

// Approach 2 
public class User 
{ 
    public int Id { get; set; } 
    public Address Address { get; set; } 

    public User() 
    { 
     this.Address = new Address(); 
    } 

} 

// Approach 3 
public class User 
{ 
    public int Id { get; set; } 
    public virtual Address Address { get; set; } 
} 

// Approach 4 
public class User 
{ 
    public int Id { get; set; } 
    public virtual Address Address { get; set; } 

    public User() 
    { 
     this.Address = new Address(); 
    } 

} 

請問我有什麼好的解釋差異?

差異與延遲加載和預先加載有關嗎?

哪個更好?爲什麼?

+0

在我看來方法3是好的。你可以在這裏找到更好的解釋http://weblogs.asp.net/dotnetstories/lazy-loading-eager-loading-explicit-loading-in-entity-framework-4 – Venky

+0

閱讀文檔:[關係和導航屬性](https ://msdn.microsoft.com/en-us/data/jj713564.aspx)。 – CodeCaster

回答

1

這是應該的樣子:

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

    public int AddressId { get; set; } 

    public virtual Address Address { get; set; }  
} 


說明:

  1. 我們需要爲virtual,以紀念我們的導航性能,使EF在運行時延遲加載。 EF創建一個繼承自用戶類的用戶代理對象,並將地址標記爲虛擬允許EF覆蓋此屬性並添加延遲加載支持代碼。

  2. 將AddressId作爲FK用於Address導航屬性,實質上是將您的用戶地址關聯轉換爲「外鍵關聯」。這些類型的關聯是首選,因爲它們在更新和修改時更容易處理。

  3. 除非您擁有對象集合形式的導航屬性(例如IList<Address>),否則不需要在構造函數中初始化它。如果您在查詢中包含EF,EF會自動爲您做到這一點。

+0

1.如果你想使用延遲加載。假的,EF工作得很好,沒有外鍵屬性。 3.您不需要初始化集合類型導航屬性。 – CodeCaster

+0

第1號:你總是可能想使用延遲加載。該對象應該允許 - 使用程序然後可以關閉它並使用急切加載。 – TomTom

+0

1.同意。你需要這樣做,因爲你仍然可以選擇退出你的關聯。 –