我收到以下異常,當我嘗試插入來自asp.net的Web API的用戶: Microsoft.EntityFrameworkCore.DbUpdateException: An error occurred while updating the entries. See the inner exception for details. ---> Npgsql.PostgresException: 23505: duplicate key value violates unique constraint
實體框架的核心:Npgsql.PostgresException:23505:重複鍵值違反唯一約束
下面是我的實體模型:角色和用戶。每個用戶鏈接到一個角色的位置。
public class Role
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public DateTime DateCreated { get; set; }
public DateTime? LastUpdate { get; set; }
}
public class User
{
public int Id { get; set; }
public Role role { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string EmailAddress { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public DateTime? DateCreated { get; set; }
public DateTime? LastLogin { get; set; }
}
我的終點是這樣的:
[HttpPost]
public async Task<IActionResult> PostUser([FromBody] User user)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
user.DateCreated = DateTime.Now;
//user.LastLogin = DateTime.Now;
var hashedPassword = BCrypt.Net.BCrypt.HashPassword(user.Password);
user.Password = hashedPassword;
_context.User.Add(user);
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateException ex)
{
Console.WriteLine(ex.Message);
if (UserExists(user.Id))
{
return new StatusCodeResult(StatusCodes.Status409Conflict);
}
else
{
Console.WriteLine(ex.Message);
}
}
return CreatedAtAction("GetUser", new { id = user.Id }, user);
}
注意做一些調試完畢後,新用戶正在從它通過下面的檢查,這意味着我的模型是有效的身體傳遞:
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
但在結束時,最終的catch程序塊上,並打印出上述異常。
這似乎試圖創建一個鏈接到新用戶的角色。我現在不是爲什麼,因爲角色已經存在。
可能是什麼這個問題的原因是什麼?
您的User實例是如何創建的,其角色設置爲什麼?嘗試在保存更改之前將角色設置爲null,以確認它是角色。如果確實是導致異常的角色,那麼您需要準確理解它何時被創建以及如何創建。您可能需要將您的角色實例附加到現有數據庫實體(否則EF是新事物並試圖插入)。閱讀Add vs. Attach以更好地理解這一點。 –
我的用戶界面是使用angular2創建的。當我在角色屬性上傳遞null時,它就起作用了。但是,當我指定一個現有的角色時,它失敗了,因爲正在嘗試重新創建角色,而不是將其附加到正在創建的新用戶。 –