zoukankan      html  css  js  c++  java
  • User、Role、Permission数据库设计ABP

    ABP 初探 之User、Role、Permission数据库设计 (EntityFramework 继承的另一种使用方法)

     最近群里(134710707)的朋友都在讨论ABP源码,我把最近学习的内容记录下来,同时也分享给大家,希望正在研究ABP源码的朋友有一定帮助。

      上篇介绍ABP的多语言,本篇主要介绍权限的数据库设计,用EntityFramework已经有段时间了,基于ABP这样的设计还是第一次看到,具体应用场景1:N,ABP权限设计,菜单的权限可以分配置给角色,也可以直接分配给用户。

      另一个应用场景也可以是订单系统:客户可以通过订单查询到客户的所有订单明细,订单明细与客户没有关系,如果想直接查看客户的订单明细,也可以通过这种方式进行设计,具体设计方法如下

      DbContext 设计类(分离出来的Demo)

      

    复制代码
    public class Test : DbContext
        {
            //您的上下文已配置为从您的应用程序的配置文件(App.config 或 Web.config)
            //使用“Test”连接字符串。默认情况下,此连接字符串针对您的 LocalDb 实例上的
            //“Study.EF.Test”数据库。
            // 
            //如果您想要针对其他数据库和/或数据库提供程序,请在应用程序配置文件中修改“Test”
            //连接字符串。
            public Test()
                : base("name=Test")
            {
            }
    
            //为您要在模型中包含的每种实体类型都添加 DbSet。有关配置和使用 Code First  模型
            //的详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=390109。
    
            public virtual DbSet<Permission> Permission { get; set; }
    
            public virtual DbSet<UserPermission> UserPermission { get; set; }
    
            public virtual DbSet<RolePermission> RolePermission { get; set; }
    
            public virtual DbSet<User> User { get; set; }
    
            public virtual DbSet<Role> Role { get; set; }
        }
    
        public class Permission
        {
            public int Id { get; set; }
            public string Name { get; set; }
        }
    
        public class UserPermission : Permission
        {
            public int UserId { get; set; }  //基于用户的权限
        }
    
        public class RolePermission : Permission
        {
            public int RoleId { get; set; }  //基于角色的权限
        }
    
        public class User
        {

    public User()
    {
    Permissions = new HashSet<UserPermission>();
    }

    public int Id { get; set; }
            public string Name { get; set; }
            [ForeignKey("UserId")]
            public virtual ICollection<UserPermission> Permissions { get; set; }  //基于用户的权限列表
        }
    
        public class Role
        {

    public Role()
    {
    Permissions = new HashSet<RolePermission>();
    }

    public int Id { get; set; }
            public string Name { get; set; }
            [ForeignKey("RoleId")]
            public virtual ICollection<RolePermission> Permissions { get; set; }  //基于角色的权限列表
        }
    复制代码

    生成的数据库是3张表,并不是5张表,如下图

    EF 添加数据方法:

    复制代码
    using (var text = new Test())
                {
                    var u = new User();
                    u.Name = "test";
                    var up = new UserPermission();
                    up.Name = "UserPermission";
                    u.Permissions.Add(up);  //添加用户权限
                    text.User.Add(u);
    
                    var role = new Role();
                    role.Name = "RoleTest";
                    var rp = new RolePermission();
                    rp.Name = "RolePermission";
                    role.Permissions.Add(rp); //添加角色权限
                    text.Role.Add(role);
    
    
                    text.SaveChanges();
                }
    复制代码

     执行结果,字段 Discriminator 是EF自己生成的字段,用来区别数据来源

     

     

  • 相关阅读:
    LeetCode
    LeetCode
    控制反转(Ioc)
    KMP算法
    *&m与m的区别
    函数指针与函数指针数组的使用方法
    C++四种类型转换
    内存分配:堆内存,栈内存
    汇编 基础
    i++,++i 作为参数
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/4609328.html
Copyright © 2011-2022 走看看