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

      最近群里(134710707)的朋友都在讨论ABP源码,我把最近学习的内容记录下来,同时也分享给你们,但愿正在研究ABP源码的朋友有必定帮助。html

  上篇介绍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>();
}spa

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张表,以下图code

EF 添加数据方法:htm

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本身生成的字段,用来区别数据来源blog

相关文章
相关标签/搜索