0

我有一个 Asp.net MVC 网站,我在其中使用数据存储中的实体框架来访问数据库(使用 POCO 实体)。

我不知道为什么,但有时,看起来延迟加载还没有完成:

代码不起作用的示例:

using(BusinessEntities context = new BusinessEntities()){
   User user = context.Users.First(u=>u.Id == parameterId);
   foreach(Post post in user.Posts){//user.Posts is null here and thrown an exception
      //.. doing some things
   }
}

但如果我这样做,它就完美了

using(BusinessEntities context = new BusinessEntities()){
   User user = context.Users.Include("Posts").First(u=>u.Id == parameterId);
   foreach(Post post in user.Posts){//user.Posts is null here and thrown an exception
      //.. doing some things
   }
}

但我不明白为什么延迟加载不起作用:

  • 上下文未处理
  • 它不是项目匿名对象或类似的东西
  • 我知道我的代码中有很多地方我不必指出这一点。包括并做相关工作
  • 我在我的 edmx 模型上将延迟加载启用设置为 True

什么可能导致这种行为?

4

2 回答 2

1

声明Posts属性,virtual以便 EF 创建的代理实体可以延迟加载该属性。

于 2012-05-09T10:49:24.340 回答
0

请从http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=8363安装 EF 4.1以停止在 Include 中使用魔术字符串。添加

using System.Data.Entity;

到您的 using 语句。

然后编写以下查询:

using(BusinessEntities context = new BusinessEntities()){
   var user = context.Users.Include(p=>p.Posts).FirstOrDefault(u=>u.Id == parameterId);
   if(user != null)
   {
      foreach(Post post in user.Posts)
      {
         //.. do something
      }
   }
}

有关详细信息,请参阅以下http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6-loading-related-entities .aspx

于 2012-05-07T07:56:40.847 回答