导航属性可以保护内部虚拟吗?

时间:2016-07-14 15:40:03

标签: c# entity-framework proxy

根据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为具有访问受保护内部虚拟的集合使用代理对象,我会错过什么?

2 个答案:

答案 0 :(得分:0)

道具不能是内部的。如果实体框架代码标记为内部,则无法访问它。删除内部,它应该工作。

代理程序中没有预先定义代理程序,因此内部工作无法正常工作。

内部项目仅对包含它们的程序集可见,EF代码在程序集外部,因此代理将无法访问它,代理具有对受保护项目的完全可见性,因为它继承了您的类受保护的成员在代理中可见。

答案 1 :(得分:0)

有点晚了,但这需要纠正,因为有可能。我一直在这样做,因为在DDD中最好的做法是隐藏可更新的集合。暴露您的收藏会发出警告。

所以我遇到了一种情况,它确实像往常一样工作。但是,另一个导航属性不起作用。然后我发现了区别...

这是行不通的

HasRequired(x => x.Source).WithMany(t => t.MyNavigationCollection);

您要做的是像这样在另一端进行配置

HasMany(t => t.MyNavigationCollection).WithRequired(x => x.Source);

(不确定是否同时需要两者。)

希望它还是有帮助的!