Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在现有数据库中实现ASP.NET标识_C#_Entity Framework_Asp.net Web Api2_Asp.net Identity - Fatal编程技术网

C# 在现有数据库中实现ASP.NET标识

C# 在现有数据库中实现ASP.NET标识,c#,entity-framework,asp.net-web-api2,asp.net-identity,C#,Entity Framework,Asp.net Web Api2,Asp.net Identity,我有一个现有的项目和SQL数据库,其中包含一个Users表(我们称之为“MyOldUsersTable”)和带有PK-FK关系的附加表(地址、电话、位置等) NB:此数据库不使用成员身份或身份。它是从另一个项目提取的数据库,“MyOldUsersTable”不包含任何登录信息(密码、上次登录等)。 我开始使用一个带有标识的Web Api项目,但它会生成默认表(AspNetUsers、AspNetUserRoles、AspNetUserLogins…) 目标:获取ASP.NET标识以使用现有表 我

我有一个现有的项目和SQL数据库,其中包含一个Users表(我们称之为“MyOldUsersTable”)和带有PK-FK关系的附加表(地址、电话、位置等)

NB:此数据库不使用成员身份或身份。它是从另一个项目提取的数据库,“MyOldUsersTable”不包含任何登录信息(密码、上次登录等)。

我开始使用一个带有标识的Web Api项目,但它会生成默认表(AspNetUsers、AspNetUserRoles、AspNetUserLogins…)

目标:获取ASP.NET标识以使用现有表

我尝试了这个解决方案: 但是Identity将“MyOldUsersTable”重命名为“MyOldUsersTable1”,并将“AspNetUsers”表重命名为“MyOldUsersTable”。这不是很有用

最好的方法是什么?我有三种选择:

  • 解决方案1:将“MyOldUsersTable”表字段移动到“ASPNETUser”表,并与其他表一起更改PK-FK
  • 解决方案2:让Identity了解users表现在是“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);
    
    然后将默认用户存储替换为自定义用户存储:

    var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));
    
    var-manager=newapplicationUserManager(newuserstore(context.Get());
    
    替换为:

    var manager = new ApplicationUserManager(new CustomUserStore(context.Get<ApplicationDbContext>()));
    
    var-manager=newapplicationusermanager(newcustomuserstore(context.Get());
    
    最后,CustomUserStore使用所需的接口实现。例如,密码、电子邮件和安全戳:

    public class CustomUserStore : IUserStore<MyOldUsersTable, int>, IUserPasswordStore<MyOldUsersTable, int>, IUserEmailStore<MyOldUsersTable, int>,  IUserSecurityStampStore<MyOldUsersTable, int>
    
    公共类CustomUserStore:IUserStore、IUserPasswordStore、IUserEmailStore、IUserSecurityStampStore
    
    那么……密码和其他数据在哪里?部署“AspNetUsers”表并迁移数据,让所有用户重置密码,听起来您的场景会更好。第一个系统没有任何登录/密码。它只是输入到系统中。但是“MyOldUsersTable”中的记录“现在已转换为真实账户。问题是,“MyOldUsersTable”不是唯一的表。它与其他表有许多依赖关系PK/FK。因此,如果我使用“AspNetUsers”,我将不得不重新创建所有10+表约束。最重要的是,“AspNetUsers”(nvarchar)和“MyOldUsersTable”(int)的PKs是不同的。只需在“AspNetUsers”和“MyOldUsersTable”之间添加新的交叉表即可。您必须获取属于具体用户的登录名
    var manager = new ApplicationUserManager(new CustomUserStore(context.Get<ApplicationDbContext>()));
    
    public class CustomUserStore : IUserStore<MyOldUsersTable, int>, IUserPasswordStore<MyOldUsersTable, int>, IUserEmailStore<MyOldUsersTable, int>,  IUserSecurityStampStore<MyOldUsersTable, int>