首页 文章

尝试使用现有用户记录在现有表中创建ASP.Net核心标识数据

提问于
浏览
1

我有一个新的ASP.Net Core网站,它使用现有的数据库,我已经为其添加了ASP.Net Core Identity用于用户管理 .

由于存在现有的用户表,我只是添加了我已正确添加ASP.Net标识列的表 .

现有表中的其他列位于我的IdentityUser派生类中 . 当我创建新用户以及登录,注销等时,站点逻辑很有效 .

问题是所有现有的“用户”记录(我称之为MyUser)都有空白的核心标识字段,因此对于身份系统调用是不可见的 .

我想编写一个遍历现有MyUser记录的实用程序,如果AspIdentityId字段为null,则将其设置为Identity子系统可管理的记录 .

我基本上是在寻找'创建'调用,但我无法使用UserManager .

CreateAsync因为这会在表中创建一条新记录,所以它不会更新现有记录 .

我有两个DB上下文(IdentityDBContext和OriginalDBContext),所以如果有一些东西允许我生成字段数据,我可以将其添加到表中的列中以用于关联记录 .

1 回答

  • 1

    好吧,我让它工作,不完全确定为什么它工作,似乎AspIdentity字段在它们被提交之前填充 . 我只添加了问题的关键特定更改,DI,上下文的设置等在项目的其他地方 .

    基本上,对于每个“域”记录,我创建一个新的ApplicationUser(IdentityUser派生)记录,并将域记录中的自定义字段的值添加到ApplicationUser记录中 . 创建此对象后,它已经填充了必要的Asp.Net Identity字段 . 然后我获取这些字段并将它们填充回域特定记录,然后我保存它 . 完成后,我重新找到记录(这可能没有必要),并根据域记录中已有的纯文本密码添加密码 .

    var clients = new List<Client>(myService.myContext.Clients);
    
            foreach (var client in clients)
            {
                var user = new ApplicationUser // Derived from IdentityUser
                {
                    UserID = client.UserID,
                    FirstName = client.FirstName,
                    LastName = client.LastName,
                    UserName = client.UserName,
                    PhoneNumber = client.Phone,
                    Email = client.Email         // Other fields omitted for brevity.
                };
    
                var idUser = user as IdentityUser;
                client.AspIdentityId = user.Id;
                client.ConcurrencyStamp = user.ConcurrencyStamp;
                client.NormalizedEmail = user.NormalizedEmail;
                client.NormalizedUserName = user.NormalizedUserName;
                client.PasswordHash = user.PasswordHash;
                client.SecurityStamp = user.SecurityStamp;
    
                myService.myContext.SaveChanges();
    
                // Can we just use the 'user' object here?
                var newUser = await myService.UserManager.FindByIdAsync(client.AspIdentityId);
                var result = await myService.UserManager.AddPasswordAsync(newUser, client.Password);
           }
    

    希望这有助于某人,这对我这样做很重要 .

相关问题