想象为EF 4.1 Codefirst设置一个简单的POCO:
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的构造函数中实例化复杂的导航属性?
如果我没有实例化,似乎我当前的所有代码都在工作,但我担心我的代码将来可能会导致问题。
是否有任何规则,最佳做法或任何副作用?
感谢您的想法和提示!
答案 0 :(得分:3)
您无需实例化Category
。类别是存在与否的单个实体 - 产品不对其创建负责。您可能需要将Customers
实例化为空列表。
它现在起作用的原因是因为你的上下文将使用动态代理包装实体,动态代理将处理你Customers
集合的实例化。因为其他代码可以访问集合而不接收NullReferenceException
。如果您在代码中创建Product
的实例而不使用EF,则可能会发生这种情况。在这种情况下,将没有动态代理,您的集合将为null =您必须自己实例化。