2011-09-18 69 views
1

想象我們有一個簡單的POCO爲EF 4.1 Codefirst:EF 4.1 Codefirst:實例複雜的導航性能

public class Product 
{ 
    // Native properties 
    [Key] 
    public Guid ID { get; set; } 

    // Navigation properties 
    public virtual Category Category { get; set; } 
    public virtual ICollection<Customer> Customers { get; set; } 

    public Product() 
    { 
     this.ID = Guid.NewGuid(); 

     // Do I have to instantiate navigation properties in the constructor or not??? 
     this.Category = new Category(); 
     this.Customers = new List<Customer>(); 
    } 
} 

我無法弄清楚到目前爲止我是否應該在POCO的構造函數實例化複雜的導航性能或不?

似乎我所有的當前代碼在工作,如果我沒有實例化,但我擔心我的代碼可能會在將來導致問題。

是否有任何規則,最佳實踐或任何副作用?

感謝您的想法和提示!

回答

3

您不需要實例化Category。類別是否存在或不存在的單一實體 - 產品不對其創建負責。您可能需要實例化Customers以清空列表。

它現在起作用的原因是因爲你的上下文將包含動態代理的實體,它將處理你的實例化集合Customers。因爲其他代碼可以訪問該集合而不會收到NullReferenceException。如果在不使用EF的情況下在代碼中創建Product的實例,則這可能會更改。在這種情況下,將不會有動態代理,並且您的集合將爲空=您將不得不實例化它。

+0

謝謝你的解釋,拉迪斯拉夫。 – Ingmar

+0

如果我正確解釋您的答案,EF會自動用代理包裝所有相關實體?無論他們是單身還是單身? – Ingmar

+0

EF使用動態代理來包裝實體。有一些基本規則必須遵循纔會發生:必須允許上下文(默認),必須允許延遲加載(默認),所有導航屬性必須是虛擬的。 –