尝试在具有现有用户记录的现有表中创建ASP.Net Core Identity数据

时间:2018-08-27 04:06:27

标签: c# asp.net-core entity-framework-core asp.net-core-identity

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

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

现有表中的其他列在我的IdentityUser派生类中。当我创建新用户以及登录,注销等操作时,站点逻辑运行良好。

问题在于所有现有的“用户”记录(我将称为MyUser)都具有空白的核心身份字段,因此对于身份系统调用而言是不可见的。

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

我本质上是在寻找“创建”调用,但是我不能使用UserManager。

CreateAsync,因为这会在表中创建一条新记录,而不更新现有记录。

我确实有两个数据库上下文(IdentityDBContext和OriginalDBContext),因此,如果有可以让我生成字段数据的内容,则可以将其添加到表中用于相关记录的列中。

1 个答案:

答案 0 :(得分: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);
       }

希望这对某人有帮助,这对我来说很重要,因为这样做是很重要的。