AbpUserOrganizationUnits / AbpUserRoles
這兩張表是 ABP 框架內的表,因爲 AbpUsers 用戶主鍵現在是 long,新增了一個 Guid 類型的 PrimaryId 字段後,對外就不再傳遞 long 類型的主鍵,所以就出現了修改這兩張中間表的需求。下面是擴展 UserRole 的實現過程,UserOrganizationUnit 實現過程一樣。
1.新增 UserRoleExtend 類,並繼承 Abp.Authorization.Users.UserRole,Discriminator 是必須的,值爲擴展表的名稱。
/// <summary>
/// 用戶與角色中間表擴展
/// </summary>
public class UserRoleExtend : Abp.Authorization.Users.UserRole
{
/// <summary>
/// 用戶 GUID 標識
/// </summary>
public Guid UserPrimaryId { get; set; }
/// <summary>
/// 自定義實體類名稱(UserRoleExtend)
/// </summary>
[MaxLength(14)]
private string Discriminator { get { return "UserRoleExtend"; } }
}
2.在 DbContext 中定義 DbSet,這樣纔可以對外使用。
public virtual DbSet<UserRoleExtend> UserRoleExtend { get; set; }
3.創用戶時同步更新中間表數據,這是重點。
/// <summary>
/// 創建用戶成功後更新角色用戶中間表擴展信息
/// </summary>
/// <param name="user"></param>
/// <returns></returns>
private async Task UpdateUserExtendInfo(User user)
{
var dbContext = _userRoleRepository.GetDbContext();
var sql = $"UPDATE \"AbpUserRoles\" SET Discriminator=@UserRoleExtend WHERE Discriminator!=@UserRoleExtend";
dbContext.Execute(sql, nameof(UserRoleExtend), nameof(UserRoleExtend));
sql = $"UPDATE \"AbpUserRoles\" SET UserPrimaryId=@PrimaryId WHERE UserId=@UserId AND UserPrimaryId IS NULL";
dbContext.Execute(sql, user.PrimaryId, user.Id);
}
第一句 SQL 是將 Discriminator 字段的值更新爲 UserRoleExtend,這樣 EntityFramework 才能查詢出這條數據;
第二句 SQL 則是更新中間表中的擴展 UserPrimaryId 字段;
老實說,當前的實現方式很挫,這樣就不能隨意更換數據庫或則需要對不同數據庫進行SQL語句兼容處理,但在沒找到更合適的方法前可以讓功能正常運行起來。如果有更優雅的實現方式將在後面更新。