多对多和自我参考表!获取用户拥有的所有角色。实体框架

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 =&gt; u.Id == id).Include(x =&gt; x.Roles).Select(x =&gt; x.Roles).ToListAsync();

我无法解决继承问题。那么,我怎样才能最好在实体框架核心中以角色名和继承的_from_group_name 的形式得到这个结果。请帮忙。

【问题讨论】:

到目前为止您尝试了什么,您的问题在哪里? 您好,感谢您与我们联系。我是 efcore 的新手,我唯一能想到的就是使用 var userRoles = context.User.Where(u =&gt; u.Id == id).Include(x =&gt; 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 进行搜索。但是您可以进行一些小的性能测试,以确保一切正常。

以上是关于多对多和自我参考表!获取用户拥有的所有角色。实体框架的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis的多表(多对多)查询

阶段3 1.Mybatis_09.Mybatis的多表操作_9 mybatis多对多操作-查询用户获取用户所包含的角色信息

rbac权限管理

Hibernate 多对多

mybatis基础学习5-一对多和多对多(简写)

多对多和形式 Symfony2