추가 열 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
언급URL : https://stackoverflow.com/questions/66928278/extending-userrole-primary-key-with-additional-columns-asp-net-core-ef
'programing' 카테고리의 다른 글
이미지를 업데이트하기 위해 배포하는 방법을 Kubernetese (0) | 2023.09.06 |
---|---|
iPython 노트북에서 DataFrame을 표로 표시 (0) | 2023.09.06 |
호버에 굵게 표시된 경우 인라인 요소가 이동합니다. (0) | 2023.09.01 |
반복 가능 읽기 트랜잭션을 사용하는 경우에도 MariaDB 여러 개의 동일한 행 (0) | 2023.09.01 |
j변수에 로드 쿼리 (0) | 2023.09.01 |