C# 实体框架在重新连接实体时不跟踪集合更改

C# 实体框架在重新连接实体时不跟踪集合更改,c#,entity-framework,mvvm,change-tracking,C#,Entity Framework,Mvvm,Change Tracking,最近,我在MVVM WPF应用程序中使用了很多实体框架,遇到了一些问题。为了显示数据,“我的视图”模型使用短实时ObjectContext。这些视图模型将在长时间运行的流程中使用,因此我更喜欢使用short-live ObjectContext,以免降低性能 所以基本上这意味着我的实体是在断开连接的模式下使用的。可以创建、查看、更新和删除这些实体。我在使用断开连接模式将更改保存回数据库时没有问题。但我发现了一种特殊情况,在调用SaveChanges()方法时,更改不会被保存,并且不会出现错误。当

最近,我在MVVM WPF应用程序中使用了很多实体框架,遇到了一些问题。为了显示数据,“我的视图”模型使用短实时ObjectContext。这些视图模型将在长时间运行的流程中使用,因此我更喜欢使用short-live ObjectContext,以免降低性能

所以基本上这意味着我的实体是在断开连接的模式下使用的。可以创建、查看、更新和删除这些实体。我在使用断开连接模式将更改保存回数据库时没有问题。但我发现了一种特殊情况,在调用
SaveChanges()
方法时,更改不会被保存,并且不会出现错误。当我尝试更新具有集合属性的实体时会发生这种情况。实体的标量属性可以毫无问题地持久化,但集合上的更改不会反映到数据库中,就像在重新连接时无法跟踪这些更改一样

下面是一个示例代码,其中我更改了实体名称,然后将一个对象添加到其报告集合中。在
SaveChanges()
之后,数据库上只反映了客户端名称

this.Client.Name = "Test Client";
this.Client.Reports.Add(new Report { Name = "Test Report" });

using (ReportCompositionEntities entities = new ReportCompositionEntities(this.connectionStringName))
{
    entities.Clients.ApplyCurrentValues(this.Client);
    entities.SaveChanges();
}
那么,我是做错了什么,还是EF在重新连接实体时无法跟踪此类更改?

就是这样。没有更改跟踪,EF不知道在导航属性中执行的更改。另外,
ApplyCurrentValues
只能处理标量和复杂属性。不是导航属性

在分离场景中修改关系时,必须在附加实体后手动告诉EF修改了哪些关系。您可以创建一些提供这些信息的自定义逻辑,并使用
ObjectStateManager
来配置所有关系的状态,或者您可以从数据库中加载带有关系的当前版本,并手动同步从分离版本到加载的附加版本的更改


顺便说一句,我从来没有使用过MVVM,所以我不确定它在这种情况下是如何应用的,但在MVP的情况下,如果它用于单个操作,您可以使用长寿上下文-例如,编辑视图将由它自己的演示者使用它自己的上下文来处理。只要视图用于编辑单个实体/聚合,此上下文将一直有效=它将用于加载实体,而相同的上下文将用于保存实体,因为在这种情况下,编辑是由相同的执行上下文执行的,并且属于单个工作单元。

非常有趣的情况。现在,EF不更新这些更改的事实是有意义的,因为导航属性的实体也可以被另一个实体引用。创建新实体时没有问题,但删除时可能会出现并发问题。在我的体系结构中,每个MVVM都是CRUD范式的一个可响应性。我将我的虚拟机移动到连接模式(处理过程由我的体系结构开箱即用地处理),内存分析目前没有发现任何问题。时间会证明一切,事实上很容易回到断开连接的模式。谢谢你的帮助。