ASP.NET ID를 사용할 때 테이블 이름을 어떻게 변경합니까?


213

Visual Studio 2013 (MSDN 2013-10-18에서 다운로드)의 릴리스 버전 (RCM이 아닌 RTM)을 사용하므로 최신 (RTM) 버전의 AspNet.Identity를 사용하고 있습니다. 새 웹 프로젝트를 만들 때 인증을 위해 "개별 사용자 계정"을 선택합니다. 다음과 같은 테이블이 생성됩니다.

  1. AspNetRoles
  2. AspNetUserClaims
  3. AspNetUserLogins
  4. AspNetUserRoles
  5. AspNetUsers

새 사용자를 등록하면 (기본 템플릿 사용)이 테이블 (위에 나열된)이 생성되고 AspNetUsers 테이블에 다음을 포함하는 레코드가 삽입됩니다.

  1. 신분증
  2. 사용자 이름
  3. 비밀번호 해시
  4. 보안 스탬프
  5. 차별

또한 "ApplicationUser"클래스에 공용 속성을 추가하여 "FirstName", "LastName", "PhoneNumber"등과 같은 추가 필드를 AspNetUsers 테이블에 추가했습니다.

여기 내 질문이 있습니다. 위의 테이블 이름을 변경하는 방법이 있습니까 (처음 생성 될 때) 또는 AspNet위에 나열된 접두어로 이름이 지정 됩니까? 테이블 이름을 다르게 지정할 수있는 경우 방법을 설명하십시오.

-업데이트-

@Hao Kung의 솔루션을 구현했습니다. 새 테이블 (예 : MyUsers)을 만들지 만 여전히 AspNetUsers 테이블을 만듭니다. 목표는 "AspNetUsers"테이블을 "MyUsers"테이블로 바꾸는 것입니다. 아래 코드와 작성된 테이블의 데이터베이스 이미지를 참조하십시오.

실제로 각 AspNet테이블을 내 자신의 이름 으로 바꾸고 싶습니다 ... fxample, MyRoles, MyUserClaims, MyUserLogins, MyUserRoles 및 MyUsers.

이 작업을 수행하고 하나의 테이블 세트 만 사용하는 방법은 무엇입니까?

public class ApplicationUser : IdentityUser
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string PostalCode { get; set; }
    public string PhonePrimary { get; set; }
    public string PhoneSecondary { get; set; }
}

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext(): base("DefaultConnection")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<IdentityUser>().ToTable("MyUsers");
    }
}

데이터베이스 테이블

-답변 업데이트-

Hao Kung과 Peter Stulinski에게 감사합니다. 이것은 내 문제를 해결했다 ...

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

        modelBuilder.Entity<IdentityUser>().ToTable("MyUsers").Property(p => p.Id).HasColumnName("UserId");
        modelBuilder.Entity<ApplicationUser>().ToTable("MyUsers").Property(p => p.Id).HasColumnName("UserId");
        modelBuilder.Entity<IdentityUserRole>().ToTable("MyUserRoles");
        modelBuilder.Entity<IdentityUserLogin>().ToTable("MyUserLogins");
        modelBuilder.Entity<IdentityUserClaim>().ToTable("MyUserClaims");
        modelBuilder.Entity<IdentityRole>().ToTable("MyRoles");
    }

확실합니까? 모든 테이블을 삭제하고 _migration 테이블을 제거한 다음 시도하십시오. 아래에 게시 한 코드는 귀하와 매우 유사하며 AspNetUsers 테이블을 만들지 않습니다.
Piotr Stulinski

1
코드와 광산의 유일한 차이점은 ApplicationUser의 이름을 "User"로 바꾼 것입니다. 내 행동은 상당히 다릅니다. 처음에는 필요에 따라 지정한 이름으로 테이블을 생성합니다. "실험"을 위해서 ApplicationUser를 User로 변경 한 다음 base.OnModelCreating (modelBuilder); modelBuilder.Entity <IdentityUser> () .ToTable ( "Users", "dbo"); modelBuilder.Entity <ApplicationUser> () .ToTable ( "사용자", "dbo");
Piotr Stulinski

1
위의 업데이트 솔루션 ...
user2315985

6
@Daskul Remove modelBuilder.Entity <IdentityUser> (). ToTable ( "MyUsers"). Property (p => p.Id) .HasColumnName ( "UserId"); 이 경우 판별 기 열이 MyUsers 테이블에 추가되지 않습니다. 자세한 내용은이 오류를 참조하십시오. stackoverflow.com/questions/22054168/…
Sergey

1
@ user2315985-@Sergey modelBuilder.Entity<IdentityUser>().ToTable("MyUsers").Property(p => p.Id).HasColumnName("UserId");에서 언급 한대로 포함 된 행을 제거하려면 답변을 업데이트해야합니다 . 그렇지 않으면 MyUsers@Daskul이 지적한대로 새로 명명 된 테이블에 구분자 열이 있습니다. 또한 MyUserClaims@Matt Overall이 지적한 것처럼 테이블 구조가 잘못되었습니다. 나는 그것이 msdn 블로그의 @Giang에 대한 의견에서 나온 아이디어를 추가한다고 생각 하지만 잘못되었습니다!
kimbaudi

답변:


125

아래에 따라 IdentityModel.cs를 수정하면이 작업을 쉽게 수행 할 수 있습니다.

DbContext에서 OnModelCreating을 재정의 한 후 다음을 추가하면 AspNetUser 테이블이 "Users"로 변경되고 기본 ID 열이 User_Id가 될 필드 이름을 변경할 수도 있습니다.

modelBuilder.Entity<IdentityUser>()
                    .ToTable("Users", "dbo").Property(p => p.Id).HasColumnName("User_Id");

또는 모든 표준 열 이름을 유지하려면 간단히 아래를 참조하십시오.

modelBuilder.Entity<IdentityUser>()
                        .ToTable("Users", "dbo")

아래의 전체 예 (IdentityModel.cs 파일에 있어야 함) 내 ApplicationUser 클래스를 User로 변경했습니다.

public class User : IdentityUser
    {
        public string PasswordOld { get; set; }
        public DateTime DateCreated { get; set; }

        public bool Activated { get; set; }

        public bool UserRole { get; set; }

    }

public class ApplicationDbContext : IdentityDbContext<User>
    {
        public ApplicationDbContext()
            : base("DefaultConnection")
        {
        }

        protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<IdentityUser>()
                .ToTable("Users", "dbo").Property(p => p.Id).HasColumnName("User_Id");
            modelBuilder.Entity<User>()
                .ToTable("Users", "dbo").Property(p => p.Id).HasColumnName("User_Id");
        }
    }

현재 테이블이 존재하는 경우이 작업을 수행하지 못했습니다. 또한 기본 열을 매핑하지 않은 열이 만들어집니다.

희망이 도움이됩니다.


2
이러한 변경 사항을 적용하려면 마이그레이션을 사용하여 변경 내용을 기존 데이터베이스로 푸시해야합니다.
Lukasz

2
이렇게하면 외래 키가 약간 이상 할 것입니다 .IdentityUser에서 테이블 이름을 변경해야한다고 생각하지 않습니다. 이 SO 게시물보기
Matt Overall

이것이 이전에 나를 알아 냈을 때 추가 검사처럼. base.OnModelCreating재정의에서 첫 번째 코드 행을 호출해야합니다. 그렇지 않으면 기본 Identity 클래스가 나머지 행을 덮어 씁니다.
DavidG

@DavidG 감사합니다
SA

좋은 해결책입니다. 그러나 IdentityUser의 테이블 이름을 덮어 쓸 필요는 없습니다. 이 솔루션을보십시오 stackoverflow.com/questions/28016684/…
EJW

59

아래는 내 작업 솔루션입니다.

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder); // This needs to go before the other rules!

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

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
}

참조 자세한 내용을 위해


유창한 api 대신 속성을 지정하여 그렇게 할 수 있습니까?
Mariusz Jamro

어떻게 든이 답변을 하향 조정하고 눈치 채지 못했을 때 사소한 편집을했습니다! 또한 이와 같은 링크에 선호되는 방법을 사용하도록 업데이트했습니다[text](link)
DavidG

빈 MVC 프로젝트를 작성하고 1 회 실행했으며 ASP 이름의 테이블이 작성되었습니다. 그런 다음이 사소한 변경 사항을 추가하고 모든 테이블과 마이그레이션 폴더를 삭제하고 가치가있는 코드를 다시 실행했지만 테이블 이름 바꾸기는 거부했습니다. 그런 다음 완전히 새로운 프로젝트를 만들고 실행하기 전에이 작업을 변경했습니다. 나는 매우 명백한 것을 놓치고 있습니까?
mathkid91

15

DbContext 클래스에서이 메소드를 재정 의하여 선택한 테이블에 맵핑 할 수 있습니다.

    protected override void OnModelCreating(DbModelBuilder modelBuilder) {
        modelBuilder.Entity<IdentityUser>()
            .ToTable("AspNetUsers");

7
전화를 잊지 마십시오 base.OnModelCreating(modelBuilder);. 나머지 모델은 생성되지 않습니다.
Ferruccio

@Hao Kung의 솔루션을 구현 한 후 내 질문을 업데이트했지만 문제가 지속됩니다. 위의 편집 된 질문을 참조하십시오. 감사.
user2315985

1

구성 클래스를 만들고 각 Identity 클래스의 모든 세부 정보를 지정할 수도 있습니다. 예를 들면 다음과 같습니다.

using System.Data.Entity.ModelConfiguration;

public class ApplicationUserConfig : EntityTypeConfiguration<ApplicationUser>
{
    public UserConfig()
    {
        ToTable("Users");
        Property(u => u.LocationName).IsRequired();
    }
}

그런 다음 OnModelCreating () 메소드에 다음 구성을 포함하십시오.

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

        modelBuilder.Configurations.Add(new ApplicationUserConfig());
        ...
    }

이를 통해 Identity 클래스의 모든 측면을 완벽하게 제어 할 수 있습니다.


1

문서화 목적으로, 앞으로 몇 년 동안 (XD와 같은)이 게시물에 올린 사람을 위해, 내 의견을 제시 한 모든 답변은 옳습니다.하지만 블로그에서 Alexandru Bucur가 제공 한이 방법으로 간단히 해결할 수 있습니다

         //But this method is not longer supported on netcore > 2.2, so I need to fix it
         foreach (var entityType in modelBuilder.Model.GetEntityTypes())
         {
            var table = entityType.Relational().TableName;
             if (table.StartsWith("AspNet"))
             {
                 entityType.Relational().TableName = table.Substring(6);
             }
         };

        //This is the functional way on NetCore > 2.2
        foreach (var entityType in modelBuilder.Model.GetEntityTypes())
        {
            var tableName = entityType.GetTableName();
            if (tableName.StartsWith("AspNet"))
            {
                entityType.SetTableName(tableName.Substring(6));
            }
        }

0

asp.net Identity 기본 테이블 이름을 다음과 같이 변경할 수 있습니다.

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

        protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<IdentityUser>().ToTable("user");
            modelBuilder.Entity<ApplicationUser>().ToTable("user");

            modelBuilder.Entity<IdentityRole>().ToTable("role");
            modelBuilder.Entity<IdentityUserRole>().ToTable("userrole");
            modelBuilder.Entity<IdentityUserClaim>().ToTable("userclaim");
            modelBuilder.Entity<IdentityUserLogin>().ToTable("userlogin");
        }
    }

또한 각 클래스를 확장하고 'IdentityUser', 'IdentityRole'등과 같은 클래스에 속성을 추가 할 수 있습니다.

    public class ApplicationRole : IdentityRole<string, ApplicationUserRole>
{
    public ApplicationRole() 
    {
        this.Id = Guid.NewGuid().ToString();
    }

    public ApplicationRole(string name)
        : this()
    {
        this.Name = name;
    }

    // Add any custom Role properties/code here
}


// Must be expressed in terms of our custom types:
public class ApplicationDbContext 
    : IdentityDbContext<ApplicationUser, ApplicationRole, 
    string, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>
{
    public ApplicationDbContext()
        : base("DefaultConnection")
    {
    }

    static ApplicationDbContext()
    {
        Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }

    // Add additional items here as needed
}

시간을 절약하기 위해 AspNet Identity 2.0 Extensible Project Template 을 사용하여 모든 클래스를 확장 할 수 있습니다.


0

그러나 .NET CORE (MVC 6)에서는 바인딩을 변경해야하므로 작동하지 않습니다.

처럼

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);

    builder.Entity<IdentityRole>().ToTable("Role");
    builder.Entity<IdentityUser>(entity => 
    {
        entity.ToTable("User");
        entity.Property(p => p.Id).HasColumnName("UserId");
    });
}

누군가를 도울 수 있습니다 :)


이것은 코드 우선과 데이터베이스 우선 모두에서 작동합니까?
liang

데이터베이스를 먼저 시도하지 않았지만 모델과 데이터베이스가 동일한 경우 작동해야한다고 생각합니다.
dnxit
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.