2

我用下面的GitHub項目通用存儲庫和UOW模式通用的UnitOfWork及與AutoMapper引發異常庫模式「相同類型的另一實體已經有相同的主鍵值」

https://genericunitofworkandrepositories.codeplex.com/

[HttpPost] 
    [Route("update")] 
    public HttpResponseMessage Update(HttpRequestMessage request, ComponentViewModel component) 
    { 
     return CreateHttpResponse(request,() => 
     { 
      HttpResponseMessage response = null; 

      if (!ModelState.IsValid) 
      { 
       response = request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState); 
      } 
      else 
      { 
       var componentDb = UnitOfWork.Repository<Component>().Find(component.ID); 

       if (componentDb == null) 
        response = request.CreateErrorResponse(HttpStatusCode.NotFound, "Invalid component."); 
       else 
       { 
        componentDb = Mapper.Map<ComponentViewModel, Component>(component); 
        UnitOfWork.Repository<Component>().Update(componentDb); // <-- ERROR'S HERE 

        UnitOfWork.SaveChanges(); 
        response = request.CreateResponse<ComponentViewModel>(HttpStatusCode.OK, component); 
       } 
      } 

      return response; 
     }); 
    } 

我得到UnitOfWork.Repository<Component>().Update(componentDb);

以下異常附加失敗,因爲另一個實體型「組件」的實體相同類型的已具有相同的主鍵值

我相信這是由於它之前的AutoMapper Mapper.Map代碼,但是,我不確定如何解決該問題。

請告知如何更正使用情況。

+0

請看看我的[ASP.NET MVC的答案 - 附加型「MODELNAME」的實體失敗,因爲另一個相同類型的實體已經具有相同的主鍵值](http://stackoverflow.com/questions/23201907/asp-net-mvc-attaching-an-entity-of-type-modelname-failed- because -another-ENT/39557606#39557606)。 –

回答

3

這是因爲您正在使用Find方法。這個方法將把返回的實體附加到你的上下文中,稍後使用Automapper創建一個斷開連接的POCO實體,然後你試圖通過Update方法連接到你的上下文,並且這兩個實體共享相同的Id。 使用Any擴展方法,而不是Find來檢查是否有與你的表Id實體:

if (UnitOfWork.Repository<Component>().Any(c=>c.Id==component.ID))// Call Any here 
{ 
     componentDb = Mapper.Map<ComponentViewModel, Component>(component); 
     UnitOfWork.Repository<Component>().Update(componentDb); 
     UnitOfWork.SaveChanges(); 
     response = request.CreateResponse<ComponentViewModel>(HttpStatusCode.OK, component); 
} 
else 
{ 
     response = request.CreateErrorResponse(HttpStatusCode.NotFound, "Invalid component."); 
} 
+0

謝謝,這工作! – billboard

+0

不客氣;) – octavioccl

相關問題