2016-08-17 128 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會理解它應該已經存在於數據庫中。

相關問題