C# 无法更新已修改的实体
我有一个特定类型实体的聚合,它存储在聚合中的集合中。现在,我想添加一个该类型的新条目,然后更新聚合,但是实体框架从不更新任何内容 模型 EF更新 请注意,API操作上有一个工作单元拦截器,它在成功执行该方法后激发DbContext.SaveChanges 有趣的是,EF从未执行过更新。我向DbContext添加了一个日志拦截器,以查看sql方面的情况,而其他一切都正常工作,update语句永远不会出现。根据分离的场景,聚合不是由EF加载的,就是由不同的上下文实例加载的。您必须将聚合附加到上下文实例,并准确地告诉它您更改了什么,为每个实体设置状态,并在对象图中设置独立关联 您必须使用即时加载,并在开始和结束时一起加载所有数据 更改实体的状态,而不是更改聚合的状态:C# 无法更新已修改的实体,c#,sql,entity-framework,asp.net-web-api,C#,Sql,Entity Framework,Asp.net Web Api,我有一个特定类型实体的聚合,它存储在聚合中的集合中。现在,我想添加一个该类型的新条目,然后更新聚合,但是实体框架从不更新任何内容 模型 EF更新 请注意,API操作上有一个工作单元拦截器,它在成功执行该方法后激发DbContext.SaveChanges 有趣的是,EF从未执行过更新。我向DbContext添加了一个日志拦截器,以查看sql方面的情况,而其他一切都正常工作,update语句永远不会出现。根据分离的场景,聚合不是由EF加载的,就是由不同的上下文实例加载的。您必须将聚合附加到上下文实
foreach(var entity in aggregate.AggregateStorage)
{
if(entity.Id == 0)
Context.Entry(entity).State = EntityState.Added;
}
MyAggregate与MyEntity的关系是否为1:多?如果是这样,MyAggregate就没有什么可更新的了,您实际上是在添加一个新的MyEntity。@CharlesMager那么我如何将这些更改提交到数据库?当我在添加实体后查询它时,是的,添加一个新的是意图,没有任何更改。如果您有更改跟踪,这应该可以工作,并且您不需要更新或任何附加或更改状态。你能为查找和更新添加完整的代码吗?@CharlesMager:只是一个摘录,但所有相关的部分都应该在那里..不,请不要,不要粘贴箱。在问题本身中包含相关代码。调用Find之后,应该很清楚聚合到底包含什么!看起来聚合集合中的实体确实没有附加,因此EF对任何更改都没有任何线索。
[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;
foreach(var entity in aggregate.AggregateStorage)
{
if(entity.Id == 0)
Context.Entry(entity).State = EntityState.Added;
}