1

ASP.NET MVC v5.2, Entity Framework v6.0 (코드 우선) 및 ID 2.0을 사용하여 웹 사이트를 구축하고 있습니다.ASP.NET ID 2.0 UserManager.FindByIdAsyc 반환하지 않는 역할

내 UserAdmin 컨트롤러에 다음 코드를 가지고 :

// GET: /UserAdmin/Details/5 
    public async Task<ActionResult> Details(string id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 

     var user = await UserManager.FindByIdAsync(id); 
     return View(user); 
    } 

내 문제는 내가 UserManager와 사용자의 역할을 채울 수 있지만, 그것은 해당 사용자와 관련된 역할을 따기되지 않는 것입니다 FindByIdAsync 메서드를 사용합니다. 상기와 같은 사용자를 나타내는 디버그 정보 여기 enter image description here

되나 역할은 제로 카운트 : 여기서

두 역할에 할당 강조된 사용자에게 표시 IdentityUserRole 테이블 데이터이다 enter image description here

이 사용자의 역할이 반환되지 않는 이유는 무엇입니까?

편집 # 1

나는 UserManager의 기본 구현을 사용하고 있지 않다.

내 응용 프로그램 사용자가 IdentityUser를 확장하여 사용자 지정 속성을 추가 할 수있게합니다. 내 ApplicationDbContext는 IdentityDbContext를 확장합니다. 당신이 IdentityDbContextIdentityUser을 확장하고, 당신이 Logins, RolesUserRoles 등을 위해 관계를 정의 할 필요가 없습니다

 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 }); 
+0

UserManager, UserStore 등의 기본 구현을 사용하고 있습니까? – Excommunicated

+1

a) 여러분의'IdentityUserRole'에는'ApplicationUser_Id'와'IdentityRole_Id' 열이 있습니다. 그들은 거기 있으면 안된다. 이러한 열을 제거하려면 DbContext를 조정하십시오. b) DbContext에서 사용자를로드 할 때 특별히 역할을로드해야합니다 (예 : http://stackoverflow.com/a/26663667/809357 – trailmax

+0

@Excommunicated 아니요, 내 ApplicationUser는 사용자 정의 속성으로 IdentityUser를 확장합니다. 내 ApplicationDBontext도 IdentityDbContext 를 확장합니다. Fluent API를 통해 관계를 설정하고 있습니다. – Dhaust

답변

4

: 나는 유창함 API를 사용하여 신원 내 기본 키를 설정하는 경우 여기에

입니다 그것들은 이미 기본 클래스에 정의되어 있습니다. 그들이 처리 할 때 modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId });과 같은 줄을 제거해야합니다.

기본값을 사용하지 않는 경우 UserManager 여기 제공된 코드를 기반으로 볼 수 있습니다.

UserManager의 기본 구현은 생성자에서 매개 변수로 IUserStore<TUser>을 사용합니다. Microsoft.AspNet.Identity.EntityFramework 라이브러리의 UserStore<TUser> 구현을 사용하거나 가져온 경우 역할, 클레임 및 로그인과 같은 항목이 데이터베이스에 대한 쿼리에 포함됩니다. IUserStore<TUser>을 구현하는 자체 클래스를 생성하는 경우 관련 데이터를 직접 포함해야합니다. 예가 아래에 나와 있습니다.

public class ApplicationUser : IdentityUser 
    { 
     //Add your Custom Properties here.. 
    } 

    public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
    { 

     //Add your Custom Properties here.. 
    } 


    public class ApplicationUserStore : IUserStore<ApplicationUser> 
    { 
     private readonly ApplicationDbContext _context; 

     public ApplicationUserStore(ApplicationDbContext context) 
     { 
      _context = context; 
     } 

     public async Task<ApplicationUser> FindByIdAsync(string userName) 
     { 
      return await _context.Users.Include(x => x.Roles).FirstOrDefaultAsync(n => n.UserName == userName); 
     } 
    } 
+0

좋은 정보를위한 건배. 그것을 체크 아웃하고 그것이 그것을 분류하면 대답으로 표시됩니다. Fluent API 수동 키 설정을 제거하는 것 외에도 http://stackoverflow.com/a/19995982/242에 따라 'OnModelCreating'에서'base.OnModelCreating (modelBuilder);를 호출하여 테스트하고 있습니다. – Dhaust