C# 通用工作单元&;自动映射引发异常的存储库模式;相同类型的另一个实体已具有相同的主键值;

C# 通用工作单元&;自动映射引发异常的存储库模式;相同类型的另一个实体已具有相同的主键值;,c#,entity-framework,automapper,repository-pattern,unit-of-work,C#,Entity Framework,Automapper,Repository Pattern,Unit Of Work,我将以下GitHub项目用于通用存储库和UoW模式 [HttpPost] [路线(“更新”)] 公共HttpResponseMessage更新(HttpRequestMessage请求,组件视图模型组件) { 返回CreateHttpResponse(请求,()=> { HttpResponseMessage响应=null; 如果(!ModelState.IsValid) { response=request.CreateErrorResponse(HttpStatusCode.BadRequ

我将以下GitHub项目用于通用存储库和UoW模式

[HttpPost]
[路线(“更新”)]
公共HttpResponseMessage更新(HttpRequestMessage请求,组件视图模型组件)
{
返回CreateHttpResponse(请求,()=>
{
HttpResponseMessage响应=null;
如果(!ModelState.IsValid)
{
response=request.CreateErrorResponse(HttpStatusCode.BadRequest,ModelState);
}
其他的
{
var componentDb=UnitOfWork.Repository().Find(component.ID);
if(componentDb==null)
response=request.CreateErrorResponse(HttpStatusCode.NotFound,“无效组件”);
其他的
{
componentDb=Mapper.Map(组件);

UnitOfWork.Repository().Update(componentDb);//这是因为您使用的是
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.");
 }  
if(UnitOfWork.Repository().Any(c=>c.Id==component.Id))//在这里调用Any
{
componentDb=Mapper.Map(组件);
UnitOfWork.Repository().Update(componentDb);
UnitOfWork.SaveChanges();
response=request.CreateResponse(HttpStatusCode.OK,组件);
}
其他的
{
response=request.CreateErrorResponse(HttpStatusCode.NotFound,“无效组件”);
}  

请看一下我的答案。
 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.");
 }