5

역할 및 사용자 지정 필드가있는 2 명의 사용자를 추가하는 데이터베이스를 시드하는 클래스가 있습니다. 내가 가진 문제는 [dbo]. [IdentityUsers] 대신 [dbo]. [AspNetUsers]에 데이터를 저장한다는 것입니다. 두 테이블이 모두 생성됩니다. 시드 할 때 데이터는 AspNetUser로 이동합니다. 웹 사이트를 시작하고 새 사용자를 등록하면 데이터가 IdentityUser로 이동합니다.Identity를 사용하여 Entity Framework 시드 (Microsoft.Owin.Security)

다음
internal sealed class Configuration : DbMigrationsConfiguration<DatabaseContext> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = true; 
    } 

    protected override void Seed(DatabaseContext context) 
    { 
     base.Seed(context); 

     var userStore = new UserStore<ApplicationUser>(); 
     var manager = new UserManager<ApplicationUser>(userStore); 

     var role = new IdentityUserRole { Role = new IdentityRole(Model.Roles.ADMINISTRATOR) }; 
     var user = new ApplicationUser() { UserName = "123123", Email = "[email protected]", Language = "en-US"}; 
     user.Roles.Add(role); 
     IdentityResult result = manager.Create(user, "123123"); 

     var role2 = new IdentityUserRole { Role = new IdentityRole(Model.Roles.NORMAL) }; 
     var user2 = new ApplicationUser() { UserName = "qweqwe", Email = "[email protected]", Language = "fr-CA" }; 
     user.Roles.Add(role2); 
     IdentityResult result2 = manager.Create(user2, "qweqwe"); 
    } 
} 

이 신원 모델에 대한 사용자 정의 필드를 정의하는 ApplicationUser 클래스입니다 : 여기

는 마이그레이션 클래스입니다.

public class ApplicationUser : IdentityUser, ICurrentUser 
{ 
    public ApplicationUser() 
    { 
     Email = ""; 
     Language = ""; 
    } 
    public string UserId { 
     get { return base.Id; } 
     set{} 
    } 
    public string Email { get; set; } 
    public string Language { get; set; } 

} 

다음은이 새 클래스에 대한 Entity Framework 구성 클래스입니다.

public class ApplicationUserConfiguration : EntityTypeConfiguration<ApplicationUser> 
{ 
    public ApplicationUserConfiguration() 
    { 
     this.HasKey(d => d.Id); 
     this.Ignore(d => d.UserId); 
    } 
} 

enter image description here

는 모두가 동일한 구성의 DataContext를 저장 사용 :

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 

     //... others entity here 

     modelBuilder.Configurations.Add(new ApplicationUserConfiguration()); 

     //Theses configuration are required since custom fields are added to ApplicationUser. Here is why : http://stackoverflow.com/questions/19474662/map-tables-using-fluent-api-in-asp-net-mvc5-ef6 
     modelBuilder.Entity<IdentityUserLogin>().HasKey(l => l.UserId); 
     modelBuilder.Entity<IdentityRole>().HasKey(r => r.Id); 
     modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId }); 

    } 

내 질문은 : 왜 신원 테이블에서 중복 ASPNET의 prefixe 테이블 이름이 무엇입니까? 웹 응용 프로그램이 다른 응용 프로그램을 사용하는 동안 시드가 왜 시드를 사용합니까?

답변

6

DbContext가 IdentityDbContext에서 상속합니까?

IdentityDbContext에서 상속하는 경우 OnModelCreating에 추가 구성이 필요하지 않습니다. IdentityDbContext와 기본 Entity Framework 규칙이 제공하는 매핑으로 충분할 것입니다. 당신은 사용자 아이디에 대한 세터없이 ApplicationUser를 선언하면

, 당신은 사용자 아이디 속성을 무시 할 필요가 없습니다 :

public class ApplicationUser : IdentityUser 
{ 
    public ApplicationUser() 
    { 
     Email = ""; 
     Language = ""; 
    } 

    public string Email { get; set; } 
    public string Language { get; set; } 

    public string UserId 
    { 
     get { return Id; } 
    } 
} 

그런 다음 ApplicationDbContext이 같이 간단 할 수 있습니다 (나는 당신의 구성 이름을 변경 한 명확성을 위해 MigrationConfiguration에 클래스) :

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
{ 
    static ApplicationDbContext() 
    { 
     Database.SetInitializer(new MigrateDatabaseToLatestVersion<ApplicationDbContext, MigrationConfiguration>()); 
    } 

    public ApplicationDbContext() 
     : base("DefaultConnection") 
    { 
    } 
} 

이 (AspNetXXXX라는 이름의 테이블 만 예상대로 AspNetUsers 테이블이 작동 AspNet.Identity.Core의 릴리스 버전 (버전 1.0.0)와 사용자 정의 필드) 및 AspNet.Identity. EntityFramework 어셈블리. enter image description here

+1

감사합니다. 나는 IdentityContext를 사용하여 모든 작업을 수행했습니다. –