Asp.net mvc Web API:IEntityChangeTracker的多个实例的EF6问题
我的web API应用程序中出现以下错误 “一个实体对象不能被IEntityChangeTracker的多个实例引用” 步骤1:浏览器将编辑后的版本发布到API控制器,API控制器反过来调用服务更新 ReleaseController.csAsp.net mvc Web API:IEntityChangeTracker的多个实例的EF6问题,asp.net-mvc,entity-framework,ef-code-first,entity-framework-6,dbcontext,Asp.net Mvc,Entity Framework,Ef Code First,Entity Framework 6,Dbcontext,我的web API应用程序中出现以下错误 “一个实体对象不能被IEntityChangeTracker的多个实例引用” 步骤1:浏览器将编辑后的版本发布到API控制器,API控制器反过来调用服务更新 ReleaseController.cs public Guid Update(EditReleaseViewModel release) { if (!ModelState.IsValid) throw new Exception("Invalid model");
public Guid Update(EditReleaseViewModel release)
{
if (!ModelState.IsValid) throw new Exception("Invalid model");
var updatedRelease = _releaseService.Update(release);
return updatedRelease.ID;
}
public Release Update(EditReleaseViewModel release)
{
var existingRelease = _context.Releases.Single(x => x.ID == release.ID);
existingRelease.Name = release.Name;
existingRelease.CatalogNumber = release.CatalogNumber;
_context.Entry(existingRelease).State = EntityState.Modified; // ERROR HAPPENS HERE!
_context.SaveChanges();
return existingRelease;
}
步骤2:服务检索并修改版本。(服务使用Ninject为每个请求注入DbContext)
ReleaseService.cs
public Guid Update(EditReleaseViewModel release)
{
if (!ModelState.IsValid) throw new Exception("Invalid model");
var updatedRelease = _releaseService.Update(release);
return updatedRelease.ID;
}
public Release Update(EditReleaseViewModel release)
{
var existingRelease = _context.Releases.Single(x => x.ID == release.ID);
existingRelease.Name = release.Name;
existingRelease.CatalogNumber = release.CatalogNumber;
_context.Entry(existingRelease).State = EntityState.Modified; // ERROR HAPPENS HERE!
_context.SaveChanges();
return existingRelease;
}
我了解到,当实体仍在内存中时(在处理以前的DbContext之前未分离),就会发生这种情况
问题可能是,在尝试在同一服务中再次更新之前,我正在使用同一服务检索版本
如果是,最好的解决方法是什么?谢谢 从dbcontext检索existingRelease的好处之一是,您的上下文已经连接,并且您的状态跟踪是免费提供的。您只需更新您的姓名/目录号并调用SaveChanges即可
public Release Update(EditReleaseViewModel release)
{
var existingRelease = _context.Releases.Single(x => x.ID == release.ID);
existingRelease.Name = release.Name;
existingRelease.CatalogNumber = release.CatalogNumber;
_context.SaveChanges();
return existingRelease;
}
手动设置实体的状态时,如下所示:
_context.Entry(existingRelease).State = EntityState.Modified;
这里发生了两件事:1)它尝试将现有的Release附加到_上下文(在这里失败,因为它已经从检索中附加到它),2)将所有属性标记为已修改,而不仅仅是已更新的2
希望有帮助