我有两个数据库,一个数据库处理用户身份验证(asp.net默认身份表),另一个数据库处理其他数据,该数据库也有一个自定义用户表。
我正在尝试更新aspnetuser表中的用户信息,这也会更新另一个数据库中的自定义用户表。我拥有的代码没有更新aspnetuser表中的必要字段,并在自定义用户表中创建了一条新记录,这不是理想的结果。下面是我到目前为止的代码。
[HttpPut("{id}")]
public async Task<IActionResult> Update(string id, ApplicationUser appUser)
{
if (!ModelState.IsValid)
{
return NotFound();
}
//locate appUser Id from AspNetUser table
var user = await _userManager.FindByIdAsync(appUser.Id);
if (user == null)
{
return NotFound();
}
//locate email address that exists in the custom User table
var contextUser = _context.UserTable.Where(u => u.Email == appUser.Email);
if (contextUser == null)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
await _userManager.UpdateAsync(appUser);
UserTable personInfo = new User();
personInfo.FirstName = appUser.FirstName;
personInfo.LastName = appUser.LastName;
personInfo.EmailAddress = appUser.Email;
_context.UserTable.Update(personInfo);
await aspnetdBContext.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
}
}
return Ok(appUser);
当我通过邮递员进行测试时,我得到了带有更改后的json结果的Ok 200代码。 aspnetuser表仍然不会更新必填字段。也不会在自定义用户表中找到该用户。我要去哪里错了?
答案 0 :(得分:0)
您应该使用从数据库中检索到的用户来防止在表中创建新用户,而无需使用new
//UserTable personInfo = new User();
contextUser.FirstName = appUser.FirstName;
contextUser.LastName = appUser.LastName;
contextUser.EmailAddress = appUser.Email;
这将帮助您更新自定义用户表。
答案 1 :(得分:0)
我相信UserTable和AppUser表是一种关联关系,或者在这种情况下可能是一对多的关系,如果User表和appuser表是关联的,那么您可以简化代码为
try
{
appUser.personInfo.FirstName = appUser.FirstName;
appUser.personInfo.LastName = appUser.LastName;
appUser.personInfo.EmailAddress = appUser.Email;
await _userManager.UpdateAsync(appUser);
await aspnetdBContext.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
}
您可能想研究一下ef Lazyloading和eagerLoading概念,以更好地了解它们的工作原理