gpt4 book ai didi

c# - 从以 id 作为外键的表中加载对象

转载 作者:行者123 更新时间:2023-11-30 21:37:20 26 4
gpt4 key购买 nike

我已经将 UserRole 类型 Role 的用户定义为另一个表的外键。 Entity Framework 自动将名称 UserRole 转换为类型为整数 (Id) 的 UserRoleId。没关系。但是我在表 User table preview 中有 UserRoleId = 2当我尝试通过 Id 获取用户时:

var user = await _userManager.FindByIdAsync(id);

所以参数 UserRole 为 null user preview from debuging .

应用程序用户:

public class ApplicationUser : IdentityUser
{
public int PriorityLevel { get; set; }
public Role UserRole { get; set; }
public string ForName { get; set; }
public string LastName { get; set; }
public string Mobile { get; set; }
public string WorkPlace { get; set; }
public string Notice { get; set; }
}

我必须使用一些 Entity Framework 命令来将 UserRole 加载为角色类型吗?或者我可以从表中获取 UserRoleId 吗?

感谢您的任何建议。

最佳答案

您用 Entity Framework 标记了您的问题,但为了以防万一,我也会介绍 Entity Framework Core,因为它们在这方面略有不同。

Entity Framework 支持延迟加载,但重要的是,该属性必须是 virtual启用它,即:

public virtual Role UserRole { get; set; }

EF 通过从您的实体派生动态“代理”类并覆盖属性来添加延迟加载属性所需的逻辑。由于非 virtual不能覆盖属性,如果没有 virtual,此逻辑不会添加到属性中.没有 virtual ,导航属性不会自动加载,并且会保持 null , 数据库中是否存在关联。

Entity Framework Core 根本不支持延迟加载,因此添加 virtual不会帮助你。

无论哪种情况,您都应该真正地进行预加载。这是通过添加 Include 来完成的您的查询。但是,你有两个问题:

  1. UserManager<TUser>不支持包含相关实体。您需要使用 DbSet ,即 context.Users .

  2. 您不能使用 IncludeFind (或任何与 Find 相关的方法),因为它具有与执行连接不兼容的逻辑。即 Find如果可能,尝试从上下文缓存中拉取实体而不进行查询,因此不能保证可以包含导航属性。因此,您将不得不切换到类似 SingleOrDefault 的内容。 .

var user = await context.Users.Include(x => x.UserRole).SingleOrDefault(x => x.Id == id);

由此,UserRole现在实际上应该有一个值。

或者,您应该能够显式加载 UserRole :

var user = await _userManager.FindByIdAsync(id);
context.Entry(user).Reference(s => s.UserRole).Load();

此方法在 Entity Framework 和 Entity Framework Core 中是相同的。但是,它仅在 1.1 中引入到 EF Core 中,因此请了解您运行的版本。这里的一个缺点是这将导致(可能)两个查询。同样,由于 Find方法尝试从上下文缓存中检索,可能您将避免在那里进行查询,但实体不在缓存中,它将进行两次查询:一次针对用户,一次针对相关人员角色。但是,延迟加载也会出现这种情况。只有急切加载允许使用 JOIN 组合查询

关于c# - 从以 id 作为外键的表中加载对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47328626/

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