实体框架要么不更新,要么在尝试更新时抛出异常

时间:2019-04-23 15:54:41

标签: c# entity-framework

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

  1. 在Web API的操作过滤器中获取模型。我在数据库中查找有关此模型的一些数据,并使用这些数据更改/合并模型的不同部分。 ,它必须完全是这种方式。

  2. 控制器运行。除了将模型传递到要保存的存储库之外,Controller不会执行任何操作。

  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

也许问题是我最初将实体返回到动作过滤器中,并且此后它脱离了上下文或其他内容?无论如何,我都不知道为什么实体框架不让我直接添加回去。

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

1 个答案:

答案 0 :(得分:0)

答案是,在我的动作过滤器中,我正在调用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;
}

}