我可以添加一个实体,但是当我尝试更新时,实体框架不起作用。这就是我正在做的:
在Web API的操作过滤器中获取模型。我在数据库中查找有关此模型的一些数据,并使用这些数据更改/合并模型的不同部分。 是,它必须完全是这种方式。
控制器运行。除了将模型传递到要保存的存储库之外,Controller不会执行任何操作。
存储库检查数据库中是否存在具有该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。
也许问题是我最初将实体返回到动作过滤器中,并且此后它脱离了上下文或其他内容?无论如何,我都不知道为什么实体框架不让我直接添加回去。
编辑:我被迫对其进行编辑,以解释另一个问题如何解决这一问题。 ...嗯,不是。举证责任应由提出索赔的人承担。
答案 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;
}
}