EntityFramework集合属性需要一个setter

时间:2013-02-05 14:54:17

标签: .net entity-framework setter navigation-properties

使用EntityFramwork(Code First)建模1-n关系的常用方法是使用虚拟集合属性,如:

class Project {
  public virtual ICollection<Remark> Remarks { get; set; }
}

class Remark {
  public virtual int ProjectId { get; set; }
  public virtual Project Project {get; set; }
}

由于Remarks集合最初是null,我采用以下方法

  private ICollection<Remark> _remarks;
  public virtual ICollection<Remark> {
    get {
      if (_remarks == null)
        _remarks = new List<Remark>();
      return _remark;
    }
    set {
       _remarks = value;
    }
  }

为了在新创建的Remarks.Add对象上使用Project方法,而无需明确设置属性。

Afaik EF内部派生自我的类并覆盖虚拟导航属性以支持延迟加载。

我的问题:我是否需要定义集合属性的 setter ? EF需要吗?我更愿意只暴露getter并让类在内部管理集合。

编辑我只是在发布后才注意到这个related question,所以也许这只是一个副本......

2 个答案:

答案 0 :(得分:6)

实体框架可以处理私有成员。您可以为酒店提供私人安装者:

private ICollection<Remark> _remarks;
public virtual ICollection<Remark> Remarks
{
    get { return _remarks ?? (_remarks = new HashSet<Remark>()); }
    private set { _remarks = value; }
}

你甚至可以完全省略setter。

答案 1 :(得分:0)

据我所见,EF Core也不需要设置器。

如果您正在使用延迟加载,则确实需要virtual。否则,您也可以忽略它。