2016-08-17 83 views
0

我收到以下异常,当我尝试插入来自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程序块上,并打印出上述异常。

这似乎试图创建一个链接到新用户的角色。我现在不是为什么,因为角色已经存在。

可能是什么这个问题的原因是什么?

+0

您的User实例是如何创建的,其角色设置为什么?尝试在保存更改之前将角色设置为null,以确认它是角色。如果确实是导致异常的角色,那么您需要准确理解它何时被创建以及如何创建。您可能需要将您的角色实例附加到现有数据库实体(否则EF是新事物并试图插入)。阅读Add vs. Attach以更好地理解这一点。 –

+0

我的用户界面是使用angular2创建的。当我在角色属性上传递null时,它就起作用了。但是,当我指定一个现有的角色时,它失败了,因为正在尝试重新创建角色,而不是将其附加到正在创建的新用户。 –

回答

0

绝对是与实体框架有关的东西。尽管我正在创建一个连接到现有角色的新用户,但仍试图重新创建角色。我去了我和点并保存实体,以确保连接到用户的角色,使用相同的数据库上下文用户在保存之前添加以下行:

var rl = _context.Role.FirstOrDefault(r=> r.Id==user.role.Id); 
user.role= rl; 

现在,它的作品...

我需要经常做这个时,我有救引用其他对象的对象?

0

如果您的角色实例已经存在,则需要安装它,让EF知道它已经存在于数据库中。否则,EF认为它是一个新实例并尝试重新创建它,导致违反唯一约束。这就是EF的工作原理,您可以阅读https://msdn.microsoft.com/en-us/data/jj592676.aspx了解更多详情(这是关于EF6的,但也适用于EFCore)。

注意,您可以为您在您自己的答案(_context.Role.FirstOrDefault(...))来完成,但是这可能涉及不必要的数据库查询从数据库也将加载现有的角色。只要你能够在.NET中完全构建角色对象,你所需要做的就是将它附加到你的上下文中,并且EF会理解它应该已经存在于数据库中。

相关问题