当我尝试从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
以下是我的实体模型:角色和用户。每个用户链接到一个角色的位置。
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块上并打印出上述异常。
似乎试图创建一个链接到新用户的角色。我现在不为什么,因为角色已经存在。
可能是此问题的原因?
最佳答案
如果您的角色实例已经存在,则需要将其附加以让EF知道它已经存在于数据库中。否则,EF会假定它是一个新实例并尝试重新创建它,从而导致唯一约束冲突。这就是EF的工作原理,您可以阅读https://msdn.microsoft.com/en-us/data/jj592676.aspx了解更多详细信息(它与EF6有关,但也适用于EFCore)。
请注意,您也可以像在自己的答案(_context.Role.FirstOrDefault(...)
)中所做的那样从数据库中加载现有角色,但这可能涉及不必要的数据库查询。只要您能够在.NET中完全构造您的Role对象,您所需要做的就是将其附加到您的上下文中,并且EF将了解它应该已经存在于数据库中。
关于c# - Entity Framework 核心: Npgsql. PostgresException:23505:重复的键值违反了唯一约束,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38990857/