gpt4 book ai didi

c# - 通过导航属性访问外键 ID 属性时如何避免延迟加载?

转载 作者:行者123 更新时间:2023-11-30 12:46:29 25 4
gpt4 key购买 nike

我正在将项目从 NHibernate 转换为 Entity Framework 6。

给定这个简单的模型:

public class User
{
public int ID { get; set; }
public string FullName { get; set; }
public virtual Organization Organization { get; set; }
// [...]
}

public class Organization
{
public int ID { get; set; }
public string Name { get; set; }
public virtual List<User> Users { get; set; }
// [...]
}

通过 Organization 导航属性访问主键 (ID) 将导致整个 Organization 实体加载到上下文中:

foreach(var user in db.Users)
Console.WriteLine(user.Organization.ID);

鉴于 OrganizationID 外键是 User 行的一部分,我应该能够访问它而不会导致整个实体的延迟加载(事实上,NHibernate 可以正确地做到这一点)。

如果没有将外键 ID 的属性添加到我所有的 100 多个实体中,这样我就可以在不加载实体的情况下访问它们的值,是否可以采取任何措施来避免这种行为?

编辑:此外,即使进行空检查也会导致加载组织实体(不在 NHibernate 中):

foreach(var user in db.Users)
Console.WriteLine(user.Organization != null);

我猜这是由于实体代理在这两个框架中的实现方式存在根本差异。所以我必须调整我的所有代码以适应这种新的令人沮丧的行为......除非有人已经经历过这个并且可以启发我?

最佳答案

不,您需要像这样将它们作为属性添加到您的类中(也就是说;如果您想要强类型)才能直接访问它。

public class User
{
public int ID { get; set; }
public string FullName { get; set; }

//added ID
public int OrganizationID { get; set; }
public virtual Organization Organization { get; set; }
// [...]
}

通过访问 int,您将阻止延迟加载,EF 将通过命名约定绑定(bind) ID。话虽如此:100+ 类...:|

更新:

正如我刚刚意识到的那样;你可能想试试:

db.Users
.Include("Organization.ID")
.Where(/*your stuff*/) //etc.;

我不确定它是否会完全加载嵌套属性。如果不是,则可能会带来很小的性能提升。

关于c# - 通过导航属性访问外键 ID 属性时如何避免延迟加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20198629/

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