我有一个特定类型实体的聚合,它存储在聚合内的一个集合中。现在我想添加该类型的新条目并在之后更新聚合,但实体框架永远不会更新任何内容!
public class MyAggregate {
protected ICollection<MyEntity> AggregateStorage { get; set; }
public void AddEntity(MyEntity entity) {
// some validation
AggregateStorage.Add(entity);
}
}
[UnitOfWork, HttpPost]
public void UpdateMyEntity(int aggregateId, MyEntityDto dto) {
var aggregate = _aggregateRepository.Find(aggregateId);
aggregate.AddEntity(...// some mapping of the dto).
_aggregateRepository.Update(aggregate);
}
EntitySet.Attach(aggregate);
Context.Entry(aggregate).State = EntityState.Modified;
(请注意,在成功执行该方法后,API动作上的工作拦截器会触发DbContext.SaveChanges()
。)
有趣的是,更新永远不会被EF执行。我已经在DbContext
添加了一个日志拦截器来查看sql-wise上的内容,而其他一切正常,更新语句永远不会发生。
答案 0 :(得分:0)
根据分离方案中的this answer(聚合未由EF加载或由不同的上下文实例加载),您必须将聚合附加到上下文实例并告诉它您更改了什么,设置状态为对象图中的每个实体和独立关联。
您必须使用预先加载并在开头加载所有数据 而不是改变聚合状态,改变实体的状态:
foreach(var entity in aggregate.AggregateStorage)
{
if(entity.Id == 0)
Context.Entry(entity).State = EntityState.Added;
}