无法更新已修改的实体

时间:2015-04-24 11:32:07

标签: c# sql entity-framework asp.net-web-api

我有一个特定类型实体的聚合,它存储在聚合内的一个集合中。现在我想添加该类型的新条目并在之后更新聚合,但实体框架永远不会更新任何内容!

模型

public class MyAggregate {
    protected ICollection<MyEntity> AggregateStorage { get; set; }

    public void AddEntity(MyEntity entity) {
        // some validation
        AggregateStorage.Add(entity);
    }
}

API控制器

[UnitOfWork, HttpPost]
public void UpdateMyEntity(int aggregateId, MyEntityDto dto) {
    var aggregate = _aggregateRepository.Find(aggregateId);
    aggregate.AddEntity(...// some mapping of the dto).

    _aggregateRepository.Update(aggregate);
}

EF更新

EntitySet.Attach(aggregate);
Context.Entry(aggregate).State = EntityState.Modified;

(请注意,在成功执行该方法后,API动作上的工作拦截器会触发DbContext.SaveChanges()。)

有趣的是,更新永远不会被EF执行。我已经在DbContext添加了一个日志拦截器来查看sql-wise上的内容,而其他一切正常,更新语句永远不会发生。

1 个答案:

答案 0 :(得分:0)

根据分离方案中的this answer(聚合未由EF加载或由不同的上下文实例加载),您必须将聚合附加到上下文实例并告诉它您更改了什么,设置状态为对象图中的每个实体和独立关联。

您必须使用预先加载并在开头加载所有数据 而不是改变聚合状态,改变实体的状态:

foreach(var entity in aggregate.AggregateStorage)
{
    if(entity.Id == 0)
        Context.Entry(entity).State = EntityState.Added;
}