Asp.net mvc Web API:IEntityChangeTracker的多个实例的EF6问题

Asp.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");

我的web API应用程序中出现以下错误

“一个实体对象不能被IEntityChangeTracker的多个实例引用”

步骤1:浏览器将编辑后的版本发布到API控制器,API控制器反过来调用服务更新

ReleaseController.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;
    }
步骤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

希望有帮助