【问题标题】:entity framework lazy loading loads only one item in collections实体框架延迟加载仅加载集合中的一项
【发布时间】:2012-05-24 10:20:48
【问题描述】:

我使用实体框架构建了两个应用程序,并尝试使用延迟加载来获取相关实体。其中一个延迟加载相关实体按预期工作,但我遇到另一个问题。我仍然可以加载相关实体,但是一旦检索到集合,我只会得到一个实体,甚至应该有更多。

我用过:

base.ContextOptions.LazyLoadingEnabled = true;

在我的数据上下文中。另外,我将我的相关收藏设为虚拟:

public virtual ICollection<Product> Products { get; set; }

我现在花了一天多的时间来寻找这两个应用程序之间的区别,但我找不到任何区别。一个应用程序的位置包含事件并且工作正常。另一个有包含产品的类别,那是不工作的。有没有人遇到过类似的问题?!我忽略了什么。

问题是当我在一个视图中迭代我的产品时,我只能看到集合中的一个元素:

@foreach(var Product in Model.Products) { @Product.Name }

然后我只得到一个产品名称,甚至应该不止一个!

【问题讨论】:

  • 您是否测试过预加载是否返回多个元素(在加载类别时使用Include("Products"))?
  • 是的,我做到了,完全一样。所以实际上这可能不是延迟加载的问题。我只是在集合中只返回一个实体。
  • 嗯,您是否仔细检查过您是否真的有不止一种产品用于相关类别?您可以通过在 SQL Server Management Studio 中编写 SQL 查询(或其他类似工具,如果您使用另一个数据库)来做一个简单的测试:说,您的问题是类别 5。然后检查 select * from products where categoryId = 5categoryId 是外国输入 products 表)并检查返回的行数。
  • 男人; 延迟加载。 (对不起;无法抗拒边缘射击的时刻)
  • 是的,我做了仔细检查。但即使我使用包含的预加载,我也只能得到一种产品。奇怪的是,我没有得到产品的空引用,但我只得到了该集合中的一项!

标签: .net entity-framework


【解决方案1】:

最近遇到了类似的问题。我们的问题是该表有一个多列键,但其中一列可以为空,因此它不能用作实体键。

从 EF 的角度来看,我们尝试加载的实体都具有相同的键,因此只加载了第一个。

我们必须为这个表创建一个唯一的 ID 列来解决这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多