gpt4 book ai didi

c# - 如何在 Entity Framework 5 中正确触发集合的延迟加载?

转载 作者:行者123 更新时间:2023-11-30 13:58:48 25 4
gpt4 key购买 nike

我在我的应用程序中使用 EF5(代码优先)。我有一个包含一些延迟加载字段的表。

public class TestEntity
{
public int Id { get; set; }

public virtual TestEntity2 SubEntity2 { get; set; }
public virtual TestEntity3 SubEntity3 { get; set; }

private ICollection<SubEntity4> _subEntities;
public ICollection<SubEntity4> SubEntities
{
get { return _subEntities ?? (_subEntities = new Collection<SubEntity4>()); }
protected set { _subEntities = value; }
}
}

当我从数据库中读取时,SubEntity2 和 SubEntity3 加载正常,但 SubEntities 集合不会加载,它始终保持 Count=0。所以我强制这样加载:

db.Entry(queryResult).Collection(rr => rr.SubEntities).Load();

但据我所知,这个集合应该在第一次调用时由 EF 自动加载,就像 SubEntity2 和 SubEntity3 一样。为什么它不适用于集合?

我用来读取数据库的代码示例:

using (var db = new TestContext(_connection, false))
{
var query = from r in db.SubEntities
where r.Id == 10
select r;

var queryRes = query.FirstOrDefault();
if (queryRes != null)
{
if (queryRes.FederalRegion != null)
{
// Do something
}

foreach (var dbEnt in queryRes.SubEntities)
{
// Do something
}
}
}

最佳答案

为了延迟加载工作,EF5 必须做一些棘手的工作。在运行时,它们创建代理类,这些代理类派生自您的模型类。在这些代理类中,它们覆盖导航属性以实现延迟加载机制。

您的 SubEntity2SubEntity3 属性是虚拟的,因此可以覆盖它们。您的 SubEntities 属性不是虚拟的 - EF5 无法覆盖此属性来为其实现延迟加载。

当您将 SubEntities 属性设为虚拟时,它应该可以正常工作。

关于c# - 如何在 Entity Framework 5 中正确触发集合的延迟加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15385969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com