gpt4 book ai didi

c# - 使用 .Include 时 Entity Framework 不会加载相关实体,除非上下文知道相关实体

转载 作者:太空宇宙 更新时间:2023-11-03 10:42:13 24 4
gpt4 key购买 nike

将 Entity Framework 6.1.x 与启动基本 Asp.NET MVC 项目时包含的默认用户 (ApplicationUser) 模型结合使用。与该问题相关的还有两个实体:客户和组织(都在进行中)。下面是客户类。

public class Customer
{
public Customer()
{
}

public int Id { get; set; }

public string UniqueId { get; set; }

public string FirstName { get; set; }

public string LastName { get; set; }

public string Email { get; set; }

public Organization Organization { get; set; }
}

出于所有目的,组织都可以被视为具有单个 Id 属性的最小实体。

以下代码不会在客户集合中包含组织:

var customers = this.context.Customers.Include(c => c.Organization)
.Join(this.context.Users.Where(u => u.Id == userId), c => c.Organization.Id, u => u.Organization.Id, (c, u) => c)
.ToList();

但是,当我将 virtual 添加到 Customer.Organization 属性,或者如果我通过运行 this.context.Organizations.ToList( )

最后,基于this post如果查询在 .Include() 发出后改变形状,则 .Include() 将无法工作,我编写了以下代码:

var customers = this.context.Customers
.Join(this.context.Users.Where(u => u.Id == userId), c => c.Organization.Id, u => u.Organization.Id, (c, u) => c)
.AsQueryable<Customer>().Include(c => c.Organization)
.ToList();

最后一个代码片段有效,所以我想我可以使用它。

然而,它没有第一个代码漂亮,但更重要的是,我真的很想了解为什么第一个代码不起作用。是因为“查询的形状”正在改变吗?如果是这样,当我在调用查询之前让上下文了解码织时,它是如何工作的?

最佳答案

延迟加载

添加 virtual 关键字(使用 Configuration.ProxyCreationEnabled = true)将启用延迟加载。

当上下文仍然存在时,任何以编程方式访问导航属性都将自动加载引用(如果尚未加载)。

本地数据

调用 context.Organizations.ToList() 会将所有组织从数据库加载到内存(在本例中为 Local data)。并且由于它是在相同的上下文中加载的,因此当更新本地数据时,所有正在跟踪的引用也会更新。

包含限制

要使您的初始代码正常工作,您需要更改连接结果

(c, u) => c

(c, u) => new { Customer = c, Organization = c.Organization }

但是 customers 结果将变为包含 Customer 属性的匿名类型集合。要返回 Customer,您需要额外的代码,例如。

.ToList().Select(c => c.Customer).ToList();

第一个查询看起来像。

var customers = this.context.Customers.Include(c => c.Organization)
.Join(this.context.Users.Where(u => u.Id == userId), c => c.Organization.Id, u => u.Organization.Id, (c, u) => new { Customer = c, Organization = c.Organization })
.ToList().Select(c => c.Customer).ToList();

The article你给的是回答this question的人写的.

关于c# - 使用 .Include 时 Entity Framework 不会加载相关实体,除非上下文知道相关实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24927184/

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