2

Я использую следующий проект GitHub для общего хранилища и UOW шаблонаGeneric UnitOfWork & Repository модели с 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-anity-of-type-modelname-failed-because -лор свой-чужой/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