我正在将以下GitHub项目用于通用存储库和UoW模式
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代码引起的,但是,我不确定如何更正该错误。
请告知如何更正用法。
那是因为您正在使用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.");
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句