我有一个新的ASP.Net Core网站,该网站使用现有数据库, 我已经为用户管理添加了ASP.Net Core Identity。
由于存在现有的用户表,因此我只添加了已正确添加ASP.Net标识列的。
现有表中的其他列在我的IdentityUser派生类中。当我创建新用户以及登录,注销等操作时,站点逻辑运行良好。
问题在于所有现有的“用户”记录(我将称为MyUser)都具有空白的核心身份字段,因此对于身份系统调用而言是不可见的。
我想编写一个遍历现有MyUser记录的实用程序,如果AspIdentityId字段为null,请将其设置为Identity子系统可管理的记录。
我本质上是在寻找“创建”调用,但是我不能使用UserManager。
CreateAsync,因为这会在表中创建一条新记录,而不更新现有记录。
我确实有两个数据库上下文(IdentityDBContext和OriginalDBContext),因此,如果有可以让我生成字段数据的内容,则可以将其添加到表中用于相关记录的列中。
答案 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);
}
希望这对某人有帮助,这对我来说很重要,因为这样做是很重要的。