ASP.NET ID를 사용할 때 테이블 이름을 어떻게 변경합니까?
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");
}
}
Please note i have not managed to get this working if the current table exists. Also note whatever columns you do not map the default ones will be created.
Hope that helps.
Below is my working solution:
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();
}
}
See this for more detail
You can try overriding this method in your DbContext class to map it to a table of your choosing:
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
modelBuilder.Entity<IdentityUser>()
.ToTable("AspNetUsers");
You can also create configuration classes and specify every detail of each of your Identity classes, for example:
using System.Data.Entity.ModelConfiguration;
public class ApplicationUserConfig : EntityTypeConfiguration<ApplicationUser>
{
public UserConfig()
{
ToTable("Users");
Property(u => u.LocationName).IsRequired();
}
}
And then include these configurations in the OnModelCreating() method:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Configurations.Add(new ApplicationUserConfig());
...
}
This will give you complete control over every aspect of the Identity classes.
We can change asp.net Identity default table names like this:
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");
}
}
Furthermore we can extend each class and add any property to classes like '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
}
To save time we can use AspNet Identity 2.0 Extensible Project Template to extend all the classes.
But it does not work in .NET CORE (MVC 6) for that we need to change binding to
like
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");
});
}
It might help someone :)
'IT story' 카테고리의 다른 글
XmlDocument를 문자열로 변환 (0) | 2020.05.07 |
---|---|
왜 내 공이 사라지는가? (0) | 2020.05.07 |
단순한 1L 대신 긴 serialVersionUID를 생성하는 이유는 무엇입니까? (0) | 2020.05.07 |
“x는 null”과“x == null”의 차이점은 무엇입니까? (0) | 2020.05.07 |
기고자 / 소유자가 아닌 경우 GitHub의 문제에 라벨을 붙이는 방법은 무엇입니까? (0) | 2020.05.07 |