Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法更新已修改的实体_C#_Sql_Entity Framework_Asp.net Web Api - Fatal编程技术网

C# 无法更新已修改的实体

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加载的,就是由不同的上下文实例加载的。您必须将聚合附加到上下文实

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

模型 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;
}