具有基于DbContext的POCO对象的EF 4.1不是延迟加载内部导航属性

时间:2011-05-03 14:02:49

标签: asp.net-mvc-3 entity-framework-4.1

我正在开发一个CRM风格的MVC网络应用程序,该应用程序具有以下(简化)架构:

联系人表

  • 的ContactID
  • 用名字

标签表

  • TAGID

ContactTags表

  • 的ContactID
  • TAGID

然后,我从* .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团队的故意设计决定?是否有可能让内部导航属性延迟加载?我知道我们可以急于加载,但是如果可能的话,我们希望避免这种情况。

1 个答案:

答案 0 :(得分:4)

POCO上的延迟加载需要创建POCO代理。仅在模型类满足特定要求时才创建代理。启用延迟加载的代理的这些要求之一是:

  

每个导航属性必须是   声明为公开,虚拟   (在Visual Basic中可以覆盖),而不是   密封(Visual。中的NotOverridable)   基本)获取访问者。

从这里引用:http://msdn.microsoft.com/en-us/library/dd468057.aspx