gpt4 book ai didi

c# - Entity Framework 在重新连接实体时不跟踪集合更改

转载 作者:太空狗 更新时间:2023-10-29 20:17:55 27 4
gpt4 key购买 nike

我最近在 MVVM WPF 应用程序中使用了很多 Entity Framework ,但遇到了一些问题。为了显示数据,我的 View 模型使用了一个短暂的 ObjectContext。这些 View 模型将在长时间运行的过程中使用,因此我更喜欢使用短期 ObjectContext 以免降低性能。

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

这是我的案例的示例代码,我更改了实体名称,然后将一个对象添加到它的报告集合中。在SaveChanges()之后,数据库中只反射(reflect)了客户端名称。

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 在重新附加实体时根本无法跟踪此类更改?

最佳答案

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

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

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

关于c# - Entity Framework 在重新连接实体时不跟踪集合更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9076852/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com