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


