多对多和自我参考表!获取用户拥有的所有角色。实体框架
Posted
技术标签:
【中文标题】多对多和自我参考表!获取用户拥有的所有角色。实体框架【英文标题】:Many to Many and Self reference Table! Get all roles a user have. Entity Framework 【发布时间】:2021-10-10 13:56:06 【问题描述】:我有一个用户表,它存储两种类型的用户:用户或组。用户可以属于一个组,该组创建一个自引用表,如下所示。
public class User
public Guid Id get; set;
public string Name get; set;
public string Email get; set;
public string Type get; set; //Group || user
public Guid GroupId get; set;
public User Group get; set;
public List<Role> Roles get; set;
一个用户可能有多个角色,反之亦然,因此我有以下两个表。
public class Role
public Guid Id get; set;
public string Name get; set;
public List<User> Users get; set;
public class UserRole
public Guid Id get; set;
public Guid UserId get; set;
public User User get; set;
public Guid RoleId get; set;
public Role Role get; set;
现在我需要一个查询来获取用户拥有的所有角色。这些角色可以直接与用户相关联,也可以从组继承,其中一个组可以从另一个组继承它。
我是实体框架核心的新手,我唯一能想到的就是使用选择直接角色
var userRoles = context.User.Where(u => u.Id == id).Include(x => x.Roles).Select(x => x.Roles).ToListAsync();
我无法解决继承问题。那么,我怎样才能最好在实体框架核心中以角色名和继承的_from_group_name 的形式得到这个结果。请帮忙。
【问题讨论】:
到目前为止您尝试了什么,您的问题在哪里? 您好,感谢您与我们联系。我是 efcore 的新手,我唯一能想到的就是使用var userRoles = context.User.Where(u => u.Id == id).Include(x => x.Roles).ToListAsync();
选择直接角色
成为新人没什么好担心的。这是关于展示努力和要解决的具体问题。用您尝试过的内容、结果是什么以及期望的结果应该是什么样子来编辑您的问题。从那里开始要容易得多。
我刚刚编辑了它。谢谢。
【参考方案1】:
我会建议一个递归解决方案,但可能会导致性能泄漏(如果有很多自引用)。
想法是你创建一个获取userId并返回角色列表的函数,函数的逻辑是我们添加用户的角色(与params中的userId相关)并且我们添加组的角色与该用户相关(我们使用相同的方法,这是诀窍)
对于递归函数,我们需要停止条件,在我的示例中,当 Group 为 null 时, 你需要一个停止条件并确保它始终是安全的,否则这会导致许多危险的问题
public List<Roles> GetUserRoles(Guid userId)
var roles = new List<Roles>();
var user= context.User.FirstOrDefault(u => u.Id == id).Include(x => x.Roles);
roles.AddRange(user.Roles);
if (user.Group != null)
roles.AddRange(GetUserRoles(user.GroupId));
return roles;
【讨论】:
感谢您的回复。是的,这会奏效。但是是否可以在不将数据加载到内存的情况下执行此操作? 我不这么认为,因为您正在创建一个逻辑关系角色 组 用户,但该框架提供了通用解决方案。在性能方面,我认为这不会增加拥抱时间或性能问题,因为我们使用的是唯一 id 进行搜索。但是您可以进行一些小的性能测试,以确保一切正常。以上是关于多对多和自我参考表!获取用户拥有的所有角色。实体框架的主要内容,如果未能解决你的问题,请参考以下文章
阶段3 1.Mybatis_09.Mybatis的多表操作_9 mybatis多对多操作-查询用户获取用户所包含的角色信息