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自己生成的字段,用來區別數據來源

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM