最近羣裏(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