根据Why do navigation properties have to be public for a proxy to be created?,导航属性可以受到内部虚拟保护,不需要是公共虚拟,实体框架仍然可以提供代理。 我编写了一个这样的导航属性:
protected internal virtual ICollection<MyEntityType> MyNavigationCollection { get; set; }
在映射中我显然有:
.WithMany(t => t.MyNavigationCollection )
这似乎与我引用的文章一致。我遇到的问题是,当我查询拥有对象时,实体框架不再向MyNavigationCollection分配代理集合的实例,因为我已将可见性更改为MyNavigationCollection的受保护内部虚拟。
为了让Entity Framework为具有访问受保护内部虚拟的集合使用代理对象,我会错过什么?
答案 0 :(得分:0)
道具不能是内部的。如果实体框架代码标记为内部,则无法访问它。删除内部,它应该工作。
代理程序中没有预先定义代理程序,因此内部工作无法正常工作。
内部项目仅对包含它们的程序集可见,EF代码在程序集外部,因此代理将无法访问它,代理具有对受保护项目的完全可见性,因为它继承了您的类受保护的成员在代理中可见。
答案 1 :(得分:0)
有点晚了,但这需要纠正,因为有可能。我一直在这样做,因为在DDD中最好的做法是隐藏可更新的集合。暴露您的收藏会发出警告。
所以我遇到了一种情况,它确实像往常一样工作。但是,另一个导航属性不起作用。然后我发现了区别...
这是行不通的
HasRequired(x => x.Source).WithMany(t => t.MyNavigationCollection);
您要做的是像这样在另一端进行配置
HasMany(t => t.MyNavigationCollection).WithRequired(x => x.Source);
(不确定是否同时需要两者。)
希望它还是有帮助的!