我有一个现有的项目和SQL数据库,其中包含一个Users表(我们称其为“ MyOldUsersTable”)和具有PK-FK关系的附加表(地址,电话,位置等)。
注意:此数据库不使用成员资格或身份。它是从另一个项目中提取的数据库,“ MyOldUsersTable”不包含任何登录信息(密码,上次登录等)
我首先使用具有身份的Web Api项目,但是它会生成默认表(AspNetUsers,AspNetUserRoles,AspNetUserLogins ...)
目标:获取ASP.NET身份以使用现有表
我尝试了以下解决方案: How can I change the table names when using Visual Studio 2013 ASP.NET Identity? 但是Identity将“ MyOldUsersTable”重命名为“ MyOldUsersTable1”,并将“ AspNetUsers”表重命名为“ MyOldUsersTable”。那不是很有用。
最佳方法是什么?我看到三个选项:
答案 0 :(得分:1)
解决方案2:保留两个系统,仅在“ AspNetUsers”和“ MyOldUsersTable”之间添加PK-FK 。可能,但是字段(电子邮件,电话)中可能有重复项。另外,要维护两个用户表也不理想。
在像这样的表之间添加“一对零”到“一对一”关系时,它起作用:
modelBuilder.Entity<MyOldUsersTable>()
.HasOptional(e => e.ApplicationUser)
.WithRequired(e => e.MyOldUsersTable)
.Map(m => m.MapKey("MyOldUsersTableId"))
.WillCascadeOnDelete(false);
最佳:解决方案3.通过删除所有来自IdentityUser的默认行为,使Identity了解现在的用户表为“ MyOldUsersTable”。
第一步是通过替换来删除对IdentityDbContext的引用:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
作者:
public class ApplicationDbContext : DbContext
然后将默认的UserStore替换为自定义的UserStore:
var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));
替换为:
var manager = new ApplicationUserManager(new CustomUserStore(context.Get<ApplicationDbContext>()));
最后,使用所需的接口实现CustomUserStore。例如密码,电子邮件和安全标记:
public class CustomUserStore : IUserStore<MyOldUsersTable, int>, IUserPasswordStore<MyOldUsersTable, int>, IUserEmailStore<MyOldUsersTable, int>, IUserSecurityStampStore<MyOldUsersTable, int>