Visual Studio 2013 (MSDN 2013-10-18에서 다운로드)의 릴리스 버전 (RCM이 아닌 RTM)을 사용하므로 최신 (RTM) 버전의 AspNet.Identity를 사용하고 있습니다. 새 웹 프로젝트를 만들 때 인증을 위해 “개별 사용자 계정”을 선택합니다. 다음과 같은 테이블이 생성됩니다.
- AspNetRoles
- AspNetUserClaims
- AspNetUserLogins
- AspNetUserRoles
- AspNetUsers
새 사용자를 등록하면 (기본 템플릿 사용)이 테이블 (위에 나열된)이 생성되고 AspNetUsers 테이블에 다음을 포함하는 레코드가 삽입됩니다.
- 신분증
- 사용자 이름
- 비밀번호 해시
- 보안 스탬프
- 차별
또한 “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");
});
}
누군가를 도울 수 있습니다 🙂