首页 > 解决方案 > 实体框架要么不更新,要么在尝试更新时抛出异常

问题描述

我可以添加一个实体,但是当我尝试更新实体框架时不起作用。这就是我正在做的事情:

  1. 在 Web API 中获取模型中的动作过滤器。我在数据库中查找有关此模型的一些数据,并使用它来更改/水合模型的不同部分。的,它必须是那样的。

  2. 控制器运行。控制器除了将模型传递到要保存的存储库之外什么都不做。

  3. 存储库检查数据库中是否存在具有该 ID 的模型。如果是这样,它会尝试附加然后保存。

代码:

_db.Airplanes.Attach(airplane);
// _db.Entry(airplane).State = EntityState.Modified; // doesn't do anything
_db.SaveChanges();

它不起作用。相反,它会抛出以下错误消息:

System.Data.Entity.Core.OptimisticConcurrencyException:'存储更新、插入或删除语句影响了意外的行数 (0)。自加载实体后,实体可能已被修改或删除。有关理解和处理乐观并发异常的信息,请参阅http://go.microsoft.com/fwlink/?LinkId=472540 。

也许问题是我最初在动作过滤器中获得了实体,但它已经脱离了上下文或其他什么?无论如何,我不知道为什么 Entity Framework 不允许我将其添加回来。

编辑:我被迫编辑这个以解释另一个问题如何解决这个问题。……嗯,不是。举证责任应由提出索赔的人承担。

标签: c#entity-framework

解决方案


答案是在我的操作过滤器中,我调用 AirplaneRepository 来获取飞机的 ID。虽然我只使用了 ID,但我猜它仍然将整个飞机添加到它的黑匣子(实体框架的黑匣子)中。解决方案是将飞机与 EF 分离。

AirplaneRepository.cs

async Task<Airplane> GetAirplane(int partId, bool detachFromEF = false)
{
    var airplane = await _db.Airplane.SingleOrDefaultAsync(c => c.partId == partId);

    if(detachFromEF)
    {
        _db.Entry(airplane).State = EntityState.Detached; // <-- the fix
    }

    return airplane;
}

async Task<int?> GetAirplaneId(int partId)
{
    var airplane = await GetAirplane(partId, true);
    return airplane == null ? (int?)null : airplane.AirplaneId;
}

}


推荐阅读