我已经阅读了各种答案,表明使用实体的构造函数提供默认属性值是很好的做法,因此:
public class Person
{
public int Id { get; set; }
public bool IsCool { get; set; }
public Person()
{
this.IsCool = true;
}
}
但是,如果您初始化导航属性...
public class Parent
{
public int Id { get; set; }
public bool IsCool { get; set; }
public Child { get; set; }
public int ChildId { get; set; }
public Parent()
{
this.IsCool = false;
this.Child = new Child();
}
}
public class Child
{
public int Id { get; set; }
public int Age { get; set; }
public Child()
{
this.Age = 13;
}
}
...然后即使我明确加载一个Child:
var parent = db.Parents.Include(p => p.Child).FirstOrDefault();
parent.Child设置为Child的新实例(Id = 0,Age = 13),这是不可取的。
有没有正确的方法呢?
答案 0 :(得分:0)
不要在构造函数中初始化导航属性,因为它会覆盖数据库中的实体化EF数据。
如果您需要确保Child
已初始化(这样您就不会被NullReferenceException
抛给您)。您可以使用支持字段:
// Navigation Property
public Child Child
{
get { return this.i_Child ?? (this.i_Child = new Child()); }
set { this.i_Child = value; }
}
// Backing Field
protected internal virtual ContactDetails i_ContactDetails { get; private set; }
不需要任何特殊的映射,Entity Framework会自动检测后备字段及其包装,并且几乎就像没有后备字段一样(但是列中的列名称)数据库将与后备字段相同,除非您明确命名它。)