EF - 构造函数中相关实体的默认值

时间:2014-04-03 11:27:36

标签: c# .net entity-framework

我已经阅读了各种答案,表明使用实体的构造函数提供默认属性值是很好的做法,因此:

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),这是不可取的。

有没有正确的方法呢?

1 个答案:

答案 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会自动检测后备字段及其包装,并且几乎就像没有后备字段一样(但是列中的列名称)数据库将与后备字段相同,除非您明确命名它。)