当构造函数是私有的时,为什么EF不能分配我的子集合?

Geo*_*uer 1 entity-framework entity-framework-6

我有一个看起来像这样的实体

public class SlideSet {
    public SlideSet(string name) : this() {
       Name = name
    }
    public SlideSet() {
        Params = new HashSet<SlideSetParameter>();
    }

    [Required]
    public string Name { get; set; }
    public virtual ICollection<SlideSetParameter> Params { get; set; } 
}
Run Code Online (Sandbox Code Playgroud)

我只是注意到我实际上并没有使用第二个构造函数,而且它在我的域中实际上没有任何意义所以我将其设为私有.Params阵列突然停止加载,总是给我一个长度为0.发生了什么事?为了加载它我需要我的构造函数至少受到保护.为什么?

Ger*_*old 5

EF能够创建代理(延迟加载所必需的)的条件之一是

该类必须具有公共或受保护的无参数构造函数.

这里(一个旧的链接,但这部分仍然适用)

代理是派生类型,它必须能够调用基类型的无参数构造函数.

  • 为了证实这一点,有人评论说"不能使用延迟加载导航属性.使用受保护!" 朱莉:"哈哈,我讨厌懒人装,所以从不尝试过.我想我最好看." (3认同)
  • 是的,EF将能够实现您的类型,但不会延迟加载.所以我可以想象,只要不需要LL,一些测试就会成功.顺便说一句,防止延迟加载可能并不坏,但我想我不会在模型级别上排除它.受保护的构造函数对我来说没问题. (2认同)