我有一个现有的项目和SQL数据库,其中包含一个用户表(我们称之为"MyOldUsersTable"(和附加的表(地址,电话,位置等(,具有PK-FK关系。
注意:此数据库不使用成员资格或标识。它是从另一个项目中提取的数据库,"MyOldUsersTable"不包含任何登录信息(密码,上次登录等(。
我首先使用带有标识的Web Api项目,但它生成了默认表(AspNetUsers,AspNetUserRoles,AspNetUserLogins...(
目标:获取 ASP.NET 标识以使用现有表
我尝试了这个解决方案: 如何在使用 Visual Studio 2013 ASP.NET 标识时更改表名? 但是Identity将"MyOldUsersTable"重命名为"MyOldUsersTable1",并将"AspNetUsers"表重命名为"MyOldUsersTable"。那不是很有用。
最好的方法是什么?我看到三个选项:
- 解决方案 1:将"MyOldUsersTable"表字段移动到"ASPNETUser"表,并将 PK-FK 与其他表一起更改
- 解决方案 2:让标识了解用户表现在是"MyOldUsersTable">
- 解决方案3:保留这两个系统,只需在"AspNetUsers"和"MyOldUsersTable"之间添加一个PK-FK。
解决方案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
然后将默认用户存储替换为自定义用户存储:
var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));
替换为:
var manager = new ApplicationUserManager(new CustomUserStore(context.Get<ApplicationDbContext>()));
最后,使用所需的接口实现自定义用户存储。例如,密码、电子邮件和安全印章:
public class CustomUserStore : IUserStore<MyOldUsersTable, int>, IUserPasswordStore<MyOldUsersTable, int>, IUserEmailStore<MyOldUsersTable, int>, IUserSecurityStampStore<MyOldUsersTable, int>