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

本文关键字:实体 默认值 构造函数 EF | 更新日期: 2023-09-27 17:56:28

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

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;
    }
}

。那么即使我显式加载一个孩子:

var parent = db.Parents.Include(p => p.Child).FirstOrDefault();

父母。Child 设置为新的 Child 实例 (Id = 0,Age = 13),这是不需要的。

有没有正确的方法可以做到这一点?

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

不要在

构造函数中初始化导航属性,因为它将覆盖数据库中的具体化 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; }

不需要任何特殊映射,实体框架将自动检测后备字段及其包装器,并且几乎就像根本没有后备字段一样(但数据库中的列名称将与后备字段相同,除非您明确命名它)。