ASP.NET ID를 사용할 때 테이블 이름을 어떻게 변경합니까? Address1 { get; set; }

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");
    }


답변

아래에 따라 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");
        }
    }

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

희망이 도움이됩니다.


답변

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

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();
    }
}

참조 자세한 내용을 위해


답변

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

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

답변

구성 클래스를 만들고 각 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 클래스의 모든 측면을 완벽하게 제어 할 수 있습니다.


답변

문서화 목적으로, 앞으로 몇 년 동안 (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));
            }
        }

답변

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 을 사용하여 모든 클래스를 확장 할 수 있습니다.


답변

그러나 .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");
    });
}

누군가를 도울 수 있습니다 🙂