【问题标题】:Lazy Loading not working in Entity Framework 6 generated from EDMX延迟加载在 EDMX 生成的实体框架 6 中不起作用
【发布时间】:2013-10-22 05:06:49
【问题描述】:

我有一个项目长期使用旧版本的实体框架,但是我需要更新数据库架构(首先使用数据库),所以 Visual Studio 2013 决定将我升级到 EF 5(我现在已升级到 EF 6) 当我更改 EDMX 文件时。

在我之前使用的实体框架中,延迟加载似乎不起作用,但我可以在集合或对象上调用 .Load(),然后从数据库中加载它。

例如,这适用于旧 EF:

public ICollection<CategoryItem> LoadedCategoryItems
{
      get
      {
    CategoryItems.Load();
        return CategoryItems;
      }
}

在 EF 5/6 中,CategoryItems 的计数为 0,因此延迟加载似乎永远不会起作用:

public ICollection<CategoryItem> LoadedCategoryItems
{
    get
    {
        return CategoryItems;
    }
}

这似乎是没有办法强制加载除了做这样的事情:

database.CategoryItems.Load();

通过以某种方式预加载它可以解决它,但是我的数据库中有一个多对多关系,我无法弄清楚如何以这种方式预加载,所以现在我非常卡住并且无法进一步.

由于类的代码是由edmx文件创建的t4模板生成的,所以肯定是虚拟的:

public virtual HashSet<CategoryItem> CategoryItems { get; set; }

包含对象的类是动态代理,开启延迟加载。

所以我不清楚为什么延迟加载不起作用或如何调试它以找出它不起作用的原因?

我怎样才能弄清楚发生了什么?

谢谢, 斯蒂芬

【问题讨论】:

  • 为什么你认为延迟加载不起作用?您在哪里访问 CategoryItems? (LazyLoading 意味着一旦你使用它就会加载数据 - 所以要加载 CategoryItems 你需要调用它的获取 - 你是在某个地方访问它而不是请显示这部分代码)
  • 当我尝试访问它时,比如说在 for 循环中列表中没有项目。另一个例子是: public Image LoadedImage { get { return Image; } } 下面是 EDMX 生成的代码: public virtual Image Image { private get;放;当试图访问图像(即:使用 get)它崩溃,因为它是空的。但是如果在初始化应用程序时我这样做:database.Images.Load();它可以工作,这意味着延迟加载不起作用。
  • 你做错了,当我没有忽略为延迟加载工作而设置的要求时,我对 EF 6 中的延迟加载没有任何问题,我希望你已经设置了这些要求。 msdn.microsoft.com/en-us/library/vstudio/… 特别是您可以检查“必须将 ProxyCreationEnabled 选项设置为 true”这一点。
  • 我绝对知道其他人正在使用它,问题是为什么它对我不起作用(似乎其他人也处于相同的情况下)?由于代码是从 edmx 文件生成的,因此它满足您建议的链接中指定的所有要求。在以前的版本中,至少我可以解决这个问题。现在我遇到了无法解决这个问题的情况,我不知道为什么延迟加载不起作用。正如我在我的帖子中所说,代理创建正在工作并且我已经重新确认它已打开,所以我需要一种方法来调试为什么代理没有做它应该做的事情。
  • 如果你愿意,你可以给我发一份测试申请,在那里你会遇到这个问题。恐怕我无能为力。不确定您是否了解 Include,但通过它您可以预加载导航属性,也可以使用多对多关系。对于正常的关系,包括看起来像 .Include("CategoryItems") - 多对多关系看起来像 .Include("CategoryItems.CategoryGroup.Category.SomeRandom") - 有了这个你可以指定你想要的表的路径和EF 会加载所有必要的东西。

标签: entity-framework lazy-loading


【解决方案1】:

由于历史原因(延迟加载之前),一些 EDMX 生成的代码使用了私有 getter。现在这不是您可以通过延迟加载完成的事情,因此必须将这些都更改为公共 getter

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-26
    • 1970-01-01
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多