programing

추가 열 ASP를 사용하여 사용자 역할 기본 키를 확장합니다.NET 코어 EF

lovejava 2023. 9. 1. 20:22

추가 열 ASP를 사용하여 사용자 역할 기본 키를 확장합니다.NET 코어 EF

ASP를 가지고 있습니다.아이덴티티 모델이 포함된 NetCore 프로젝트.Pomelo MySQL 공급자와 함께 10.4.17-MariaDB 데이터베이스를 사용합니다.이 프로젝트는 이미 프로덕션에서 사용되고 있지만 최신 버전의 새 키로 사용자 역할을 확장하고 싶습니다.IdentityUserRole을 다음과 같이 확장하는 고유한 UserRole 클래스를 정의했습니다.

public class UserRole : IdentityUserRole<String>
{
    [Key]
    public Guid OrganizationId { get; set; }
    [Key]
    public DateTime Join { get; set; }
    ...
}

따라서 사용자가 '가입' 날짜가 여러 개인 여러 조직에서 여러 역할을 수행했으면 합니다.DB 컨텍스트에서 엔티티에 HasKey 행을 수동으로 추가했습니다.

modelBuilder.Entity<UserRole>(entity =>
{
    entity.HasKey(m => new { m.UserId, m.RoleId, m.Join, m.OrganizationId });
    entity.Property(m => m.UserId).HasMaxLength(127);
    entity.Property(m => m.RoleId).HasMaxLength(127);
    entity.Property(m => m.OrganizationId).HasMaxLength(127);
    entity.Property(m => m.Join);
    ...
});

이러한 변경 사항이 있는 마이그레이션을 추가하고 이를 실행하려고 하면 다음 오류가 발생합니다.

Failed executing DbCommand (31ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
ALTER TABLE `AspNetUserRoles` ADD CONSTRAINT `FK_AspNetUserRoles_AspNetRoles_RoleId` FOREIGN KEY (`RoleId`) REFERENCES `AspNetRoles` (`RoleId`) ON DELETE CASCADE;

마이그레이션에서 다음 항목을 참조하려고 하는 이유는 무엇입니까?RoleId의 기본 키인 경우AspNetRoles테이블이 호출됩니다.Id?

첫 번째 마이그레이션을 확인했습니다.Script-Migration명령 및 외부 키가 올바르게 참조됩니다.Id테이블을 만드는 동안.

알고 보니 제가 사용했던 Pomelo 라이브러리의 알파 버전에 있는 버그였습니다.버그는 그 때 이미 야간 빌드에서 수정되었습니다.Github의 #1371호를 참조하십시오.

우리는 이 두 PK {u를 유지해야 합니다.사용자 ID, u.asp.net 핵심 ID 관리자 기능(예: userManager)에 대한 RoleId }.역할 동기화에 추가()

ID가 ID인 경우:사용자 역할 테이블에서 예:

DbContext:

namespace Attendance.Server.Data;

public class AppDbContext : IdentityDbContext<User, Role, int, UserClaim, UserRole, UserLogin, RoleClaim, UserToken>, IUnitOfWork
{
    public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }

    public Task<int> SaveChangesAsync()
    {
        return base.SaveChangesAsync();
    }

    public void MarkAsDeleted<TEntity>(TEntity entity) => base.Entry(entity).State = EntityState.Deleted;

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
 modelBuilder.ApplyConfigurationsFromAssembly(typeof(UserConfig).Assembly);
        
    }
}

사용자 역할:

namespace Attendance.Server.Data.Entities;

public partial class UserRole : IdentityUserRole<int>
{
    public int Id { get; set; }
}

사용자 역할 구성:

namespace Attendance.Server.Data.Configs;

public class UserRoleConfig : IEntityTypeConfiguration<UserRole>
{
    public void Configure(EntityTypeBuilder<UserRole> builder)
    {
        builder.ToTable("UserRole").HasKey(ur => new { ur.Id });
        builder.Property(p => p.Id).ValueGeneratedOnAdd();
        // we have to keep these two column PK for asp.net core identity managers functionality for example : userManager.AddToRoleAsync()
        builder.HasKey(u => new { u.UserId, u.RoleId }); 
        builder.Property(p => p.Id).HasColumnOrder(1);

        // seed
        builder.HasData(
            new UserRole { Id = 1, UserId = 1, RoleId = 1 }
        );
    }
}

그런 다음 데이터베이스로 마이그레이션:

dotnet ef 마이그레이션 createDb -o 데이터/마이그레이션 추가

dotnetef 데이터베이스 업데이트

마이그레이션에 오류가 발생하면 ssms에서 데이터베이스를 삭제하고 이 명령을 다시 실행합니다. dotnetef database update

enter image description here

언급URL : https://stackoverflow.com/questions/66928278/extending-userrole-primary-key-with-additional-columns-asp-net-core-ef