【问题标题】:Entity Framework does not track collection changes when reconnecting an entity重新连接实体时,实体框架不跟踪集合更改
【发布时间】:2012-01-31 08:59:04
【问题描述】:

我最近在 MVVM WPF 应用程序中使用了很多实体框架,但遇到了一些问题。为了显示数据,我的视图模型使用了一个短暂的 ObjectContext。这些视图模型将在长期运行的过程中使用,因此我更喜欢使用短期 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 在重新附加实体时根本无法跟踪此类更改?

【问题讨论】:

    标签: c# entity-framework mvvm change-tracking


    【解决方案1】:

    那是exactly what happens。没有更改跟踪,EF 不知道导航属性中执行的更改。 ApplyCurrentValues 也只能处理标量和复杂属性。不是导航属性。

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

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

    【讨论】:

    • 非常有趣的案例。现在 EF 不更新这些更改的事实是有意义的,因为导航属性的实体也可以被另一个实体引用。创建新实体时没有问题,但删除时可能会出现并发问题。在我的架构中,每个 MVVM 作为 CRUD 范式的单一责任。我将我的 VM 移动到连接模式(处理过程由我的体系结构开箱即用)并且内存分析目前没有发现任何问题。时间会证明一切,实际上很容易回到断开模式。感谢您的帮助。
    猜你喜欢
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 2014-12-08
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    相关资源
    最近更新 更多