附加类型为“X”的实体失败,因为同一类型的另一个实体已具有相同的主键值

错误信息 :

附加“FaridCRMData.Models.Customer”类型的实体失败,因为同一类型的另一个实体已具有相同的主键值。 如果图中的任何实体具有冲突的>键值,则在使用Attach()方法或将实体的状态设置为“未更改”或“已修改”时,可能会发生这种情况。 这可能是因为某些实体是新的并且尚未收到数据库生成的键值。 在这种情况下,使用“添加”方法或“已添加”实体状态来跟踪图形,然后根据需要将非新实体的状态设置为“未更改”或“已修改”。

我的代码:

 public class FactorController : Controller { public JsonResult SaveFactor(Factor factor,int id) { if (id > 0) { bool result = new FactorService.BaseService.Update(factor); return new JsonResult() { Data = result }; } } } 

FactorService.BaseService.cs:

 public bool Update(TEntity entity) { var entry = context.Entry(entity); if (entry.State == EntityState.Detached || entry.State == EntityState.Modified) { context.Set().Attach(entity);// Error Is Here entry.State = EntityState.Modified; context.SaveChanges(); } return true; } 

您是否尝试将您的实体标记为已修改,然后将其附加到上下文?

像这样:

 public bool Update(TEntity entity) { var entry = context.Entry(entity); if (entry.State == EntityState.Detached || entry.State == EntityState.Modified) { entry.State = EntityState.Modified; //do it here context.Set().Attach(entity); //attach context.SaveChanges(); //save it } return true; } 

为尝试更新的实体尝试简单的更改状态和SaveChanges()

 public bool Update(TEntity entity) { context.Entry(entity).State = System.Data.EntityState.Modified; context.SaveChanges(); return true; } 

我相信你可能在更新之前调用了Select,默认情况下,DBContext将在它们被命名时被缓存(选中),在获取记录时在select选择中使用“AsNoTracking()”。