2

내 프로젝트는 Microsoft ASP.NET Identity Framework를 사용하며 최근까지 버전 2.0을 사용하고 올바르게 작동하기까지했습니다. - 지금까지 좋은 일이UserRole 테이블에 중복되지만 이름이 다른 열이있어 역할 확인 문제가 발생합니다.

enter image description here

적 2.1로 업그레이드 한 이후, 두 번째 세트 [널]를 떠날 것으로 보인다 : 나는 UserRole 테이블이 4 열은 기본적으로 동일한 데이터를 유지 한 것을 다시 발견 내가 우려하고있다으로 (그 여분의 열이 정의 어디서 찾을 수 없습니다.)

modelBuilder.Entity<IdentityUserClaim>().ToTable("UserClaim"); 
     modelBuilder.Entity<IdentityUserLogin>().ToTable("UserLogin"); 
     modelBuilder.Entity<IdentityRole>().ToTable("Role"); 
     modelBuilder.Entity<ApplicationUser>().ToTable("User"); 

     modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId); 
     modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id); 
     modelBuilder.Entity<IdentityUserRole>().HasKey(r => new 
     { 
      r.RoleId, 
      r.UserId 
     }).ToTable("UserRole");; 

을 내가 그것을 사용하는 갈 때 문제가 발생 :

await _manager.AddToRoleAsync(applicationUser.Id, "Admin"); 

이것을 호출하면 처음 두 열이 채워지는 반면,

var userRoles = await _manager.GetRolesAsync(applicationUser.Id); 

은 두 번째 열 집합을 쿼리하는 것처럼 보입니다. 첫 번째 두 열에서 값을 복사하여 붙여 넣지 않으면 [Null]을 반환하기 때문에이 사실을 알 수 있습니다.

나는이 점을 밝혀내는 데 도움이 될만한 코드를 찾고 있었지만이 시점에서 완전한 손실이 있음을 인정합니다.

+0

프로젝트에 돌아가서 수동으로 UPDATE를 실행하면 엔티티 모델 또는 테이블을 새로 고쳐야 할 수 있습니다 ... 이것이 박쥐에 대해 생각할 수있는 유일한 것입니다. – MethodMan

+0

PowerShell의 'update-database'명령은 무엇입니까? 만약 그렇다면, 네, 그 이후에 몇 가지 마이그레이션을했습니다 ... – Incognos

+0

'ApplicationUser_Id'와'IdentityRole_Id' 열은 그 테이블에 있어서는 안됩니다. 이 열을 가져 오려면 모델/dbContext를 조정해야합니다. – trailmax

답변

3

일부 신중한 검색 후이 게시물이 Authorize and GetRoles doesn't work in ASP.NET Identity입니다. 이것은 마이그레이션의 일부 편집과 함께 문제를 해결했습니다.

는 요약 :

가 내 컨텍스트 파일 에

base.OnModelCreating(modelBuilder); 

을 추가하고 모델 생성 부분

 modelBuilder.Entity<IdentityUserClaim>().ToTable("UserClaim"); 
     modelBuilder.Entity<IdentityUserLogin>().ToTable("UserLogin"); 
     modelBuilder.Entity<IdentityRole>().ToTable("Role"); 
     modelBuilder.Entity<ApplicationUser>().ToTable("User"); 
     modelBuilder.Entity<IdentityUserRole>().ToTable("UserRole"); 

     //modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId); 
     //modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id); 
     //modelBuilder.Entity<ApplicationUser>().HasMany<IdentityUserRole>(u => u.Roles); 
     //modelBuilder.Entity<IdentityUserRole>().HasKey(r => new 
     //{ 
     // r.RoleId, 
     // r.UserId 
     //}); 
마이그레이션 코드가 일부 열을 삭제하고 다른 사람의 이름을 변경하려고

편집, 그래서 삭제하고 이름을 변경하는 대신 이름을 바꿀 열을 삭제하고 기존 열을 그대로 유지했습니다. 기존 열을 삭제하려면 외래 키도 제거해야합니다. 또한 기본 키를 다시 만들지 못하게해야했습니다.

 DropIndex("dbo.UserClaim", new[] { "ApplicationUser_Id" }); 
     DropIndex("dbo.UserLogin", new[] { "ApplicationUser_Id" }); 
     DropIndex("dbo.UserRole", new[] { "ApplicationUser_Id" }); 
     DropIndex("dbo.UserRole", new[] { "IdentityRole_Id" }); 
     DropForeignKey("FK_dbo_UserClaim_ApplicationUser_Id", "ApplicationUser_Id"); 
     DropForeignKey("FK_dbo_UserLogin_ApplicationUser_Id", "ApplicationUser_Id"); 
     DropForeignKey("FK_dbo_UserRole_ApplicationUser_Id", "ApplicationUser_Id"); 
     DropForeignKey("FK_dbo_UserRole_IdentityRole_Id", "Identity_Id"); 
     DropColumn("dbo.UserClaim", "ApplicationUser_Id"); 
     DropColumn("dbo.UserLogin", "ApplicationUser_Id"); 
     DropColumn("dbo.UserRole", "ApplicationUser_Id"); 
     DropColumn("dbo.UserRole", "IdentityRole_Id"); 
     //DropPrimaryKey("dbo.UserLogin"); 
     //DropPrimaryKey("dbo.UserRole"); 
     AlterColumn("dbo.User", "Email", c => c.String(maxLength: 256)); 
     AlterColumn("dbo.User", "UserName", c => c.String(nullable: false, maxLength: 256)); 
     AlterColumn("dbo.UserClaim", "UserId", c => c.String(nullable: false, maxLength: 128)); 
     AlterColumn("dbo.UserClaim", "UserId", c => c.String(nullable: false, maxLength: 128)); 
     AlterColumn("dbo.UserLogin", "LoginProvider", c => c.String(nullable: false, maxLength: 128)); 
     AlterColumn("dbo.UserLogin", "ProviderKey", c => c.String(nullable: false, maxLength: 128)); 
     AlterColumn("dbo.UserLogin", "UserId", c => c.String(nullable: false, maxLength: 128)); 
     AlterColumn("dbo.UserRole", "UserId", c => c.String(nullable: false, maxLength: 128)); 
     AlterColumn("dbo.UserRole", "RoleId", c => c.String(nullable: false, maxLength: 128)); 
     AlterColumn("dbo.Role", "Name", c => c.String(nullable: false, maxLength: 256)); 
     //AddPrimaryKey("dbo.UserLogin", new[] { "LoginProvider", "ProviderKey", "UserId" }); 
     //AddPrimaryKey("dbo.UserRole", new[] { "UserId", "RoleId" }); 
     CreateIndex("dbo.User", "UserName", unique: true, name: "UserNameIndex"); 
     CreateIndex("dbo.UserClaim", "UserId"); 
     CreateIndex("dbo.UserLogin", "UserId"); 
     CreateIndex("dbo.UserRole", "UserId"); 
     CreateIndex("dbo.UserRole", "RoleId"); 
     CreateIndex("dbo.Role", "Name", unique: true, name: "RoleNameIndex"); 

는 마이크로 소프트 ASP.NEt 정체성과 좌절 경험이었고 나는 위의 도움이 사람 머리보다 몇 가닥을 유지 바랍니다.