[英]Asp.net identity entity framework database first approach with own table defintion
我有以下四個表
角色表
用戶表
UserRole表
UserType表
默認的Asp.net身份具有以下表格,如Asp.netusers,Asp.netRoles,Asp.netuserlogins,Asp.netuserclaims,Asp.netuserroles
我的表格與相同的列名不匹配,並且某些列在我的表格中不可用。 我可以使用自己的表來利用asp.net身份的功能嗎,否則我需要將Asp.netusers表中使用的相同列應用於User表。
這是在表中添加所需的所有列嗎?
我已經使用相同的默認表實現了asp.net身份EF數據庫優先方法。 我有單獨的角色存儲和用戶存儲
在下面的上下文中,用戶,userroles是與asp.net身份相同的默認表(asp.netusers,asp.netroles)
public partial class OVT_UserEntities : DbContext
{
public OVT_UserEntities()
: base("name=OVT_UserEntities")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
public virtual DbSet<UserClaim> UserClaims { get; set; }
public virtual DbSet<UserLogin> UserLogins { get; set; }
public virtual DbSet<UserRole> UserRoles { get; set; }
public virtual DbSet<User> Users { get; set; }
}
用戶類別:
public partial class User : IUser<int>
{
}
角色類別:
public partial class UserRole : IRole<int>
{
}
現在我想使用上面的四個新表(上面的表設計圖像),而不是使用asp.net身份提供的現有表。 所以我不確定是否需要在數據庫中添加相同的所有表和列才能使用asp.net身份?
由於您使用的是Microsoft.AspNet.Identity
,因此應該從IdentityUser
(命名空間Microsoft.AspNet.Identity.EntityFramework
)繼承您的User。
您的類應按以下方式定義:
用戶
public class User : IdentityUser<int, UserLogin, UserRole, UserClaim>
{
}
角色
public class Role : IdentityRole<int, UserRole>
{
}
用戶角色
public class UserRole : IdentityUserRole<int>
{
}
用戶要求
public class UserClaim : IdentityUserClaim<int>
{
}
用戶登錄
public class UserLogin : IdentityUserLogin<int>
{
}
您可以擴展類,添加自己的自定義列:
public class User : IdentityUser<int, UserLogin, UserRole, UserClaim>
{
public string CompanyName { get; set; }
}
現在,您必須定義商店:
public class UserStore: UserStore<User, Role, int, UserLogin, UserRole, UserClaim>
{
public UserStore(MyContext context)
: base(context)
{
}
}
然后是您的數據庫上下文,繼承自IdentityDbContext
:
public class MyContext : IdentityDbContext<User, Role, int, UserLogin, UserRole, UserClaim>
{
public MyContext(): base("ConnectionString")
{
}
}
在數據庫上下文( MyContext )中,您必須重寫OnModelCreating
以便可以創建列,更改類型,表名稱等:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<MyUser>()
.Property(p => p.Id)
.HasColumnType("int")
.IsRequired();
modelBuilder.Entity<MyRole>()
.Property(p => p.Id)
.HasColumnType("int")
.IsRequired();
modelBuilder.Entity<MyUserRole>()
.Property(p => p.RoleId)
.HasColumnType("int")
.IsRequired();
modelBuilder.Entity<MyUserRole>()
.Property(p => p.UserId)
.HasColumnType("int")
.IsRequired();
modelBuilder.Entity<MyUserClaim>()
.Property(p => p.Id)
.HasColumnType("int")
.IsRequired();
modelBuilder.Entity<MyUserClaim>()
.Property(p => p.UserId)
.HasColumnType("int")
.IsRequired();
modelBuilder.Entity<MyUserLogin>()
.Property(p => p.UserId)
.HasColumnType("int")
.IsRequired();
modelBuilder.Entity<MyUser>()
.ToTable("Users");
modelBuilder.Entity<MyRole>()
.ToTable("Roles");
modelBuilder.Entity<MyUserRole>()
.ToTable("UserRoles");
modelBuilder.Entity<MyUserClaim>()
.ToTable("UserClaims");
modelBuilder.Entity<MyUserLogin>()
.ToTable("UserLogins");
}
我更新了一個github 項目來反映您的情況。
更新 :
如果要自定義列的名稱和類型,只需給它們命名:
modelBuilder.Entity<User>()
.Property(p => p.Id)
.HasColumnName("user_id")
.HasColumnType("SMALLINT")
.IsRequired();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.