我正在开发一个CRM风格的MVC网络应用程序,该应用程序具有以下(简化)架构:
联系人表
标签表
ContactTags表
然后,我从* .edmx文件生成POCO对象,与基于DbContext的实体上下文交互,隐藏ContactTags表,以便将Contact和Tag实体之间的关系建模为多对多关联。然后,我限制了对原始Contact.Tags导航属性的访问,将其设置为内部而不是公共,并公开了一个ReadOnlyCollection,可以在Domain层之外用于显示标记,但是将集合上的数据操作限制为Contact .EditTags()方法。
在编写UI代码以显示联系人上的标记列表时,我发现标签导航属性没有延迟加载。在抓了我的头并且谷歌搜索了一下之后,我在EF CTP4 lazy loading not playing ball发现了另一个与我的问题相符的问题。该问题的作者发现,当他将内部属性更改为公开时,它就开始工作了,当然这也是我发生的事情 - 我已经将标签导航属性更改为公共属性,现在它正在运行。 / p>
从对象建模/数据封装的角度来看,我对此感到不舒服,因为UI不应该被授予对原始Tags集合的访问权限,这将使控制器代码能够调用Tags.Add(),Tags.Remove等等。
有谁知道这是一个错误,还是EF团队的故意设计决定?是否有可能让内部导航属性延迟加载?我知道我们可以急于加载,但是如果可能的话,我们希望避免这种情况。
答案 0 :(得分:4)
POCO上的延迟加载需要创建POCO代理。仅在模型类满足特定要求时才创建代理。启用延迟加载的代理的这些要求之一是:
每个导航属性必须是 声明为公开,虚拟 (在Visual Basic中可以覆盖),而不是 密封(Visual。中的NotOverridable) 基本)获取访问者。