ABP 擴展 UserOrganizationUnit / UserRole 等中間表

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語句兼容處理,但在沒找到更合適的方法前可以讓功能正常運行起來。如果有更優雅的實現方式將在後面更新。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章