gpt4 book ai didi

c# - 如何确定 Entity Framework 对象是否已更改?

转载 作者:行者123 更新时间:2023-11-30 19:46:10 24 4
gpt4 key购买 nike

我有一个名为 Uczestnik 的对象,它刚刚保存到数据库中

var konsultant = uczestnik.Konsultanci; 
uczestnik.Konsultanci = null; // null attached object and reuse it's ID later on for SAVE purposes
uczestnik.KonsultantNazwa = konsultant.KonsultantNazwa;
uczestnik.Szkolenie = null; // null attached object and reuse it's ID later on for SAVE purposes
uczestnik.SzkolenieID = szkolenie.SzkolenieID;
context.SzkolenieUczestnicies.AddObject(uczestnik);
context.SaveChanges();
context.Detach(uczestnik); // detatch to prevent Context problems
uczestnik.Szkolenie = szkolenie;// reassign for use in ObjectListView
uczestnik.Konsultanci = konsultant; // reassign for use in ObjectListView

保存后,它会返回到 ObjectListView,用户决定在其中更改某个值并且该值已更改(准确地说是多个值中的一个值)。如果我检查值的实体状态,它处于未更改状态,因此调用 .Attach 和 .SaveChanges() 不会执行任何操作。我可以使用 ChangeObjectState,但如果没有任何更改,那么这样做就没有意义。

context.SzkolenieUczestnicies.Attach(uczestnik);
//context.ObjectStateManager.ChangeObjectState(uczestnik, EntityState.Modified);
context.SaveChanges();

我如何检测更改并防止不必要的流量(我可以想象保存 5mb 大文件的对象中没有任何更改的情况)所以 resaving 它没有意义。除非 Entity 足够聪明,可以检测到只有一个字段从 15 改变了,并且只改变那个字段?

最佳答案

如果实体与上下文分离,除非您从数据库中重新加载原始实体,或者您正在使用自跟踪实体或以某种方式自行管理跟踪,否则您无法找出发生了什么变化。

如果您重新加载实体,您可以使用 ApplyCurrentValues:

var originalEntity = context.MyEntities.Single(e => e.Id == detachedEntity.Id);
context.MyEntities.ApplyCurrentValues(detachedEntity);
context.SaveChanges();

此方法将属性标记为已修改,这些属性在原始实体和分离实体之间具有不同的值。 SaveChanges 将创建一个更新语句,其中仅包含那些已更改的属性。如果没有属性发生变化,SaveChanges 什么都不做。

但是您并没有完全摆脱“不必要的流量”,因为您必须加载原始实体,但是您将保存一个不必要的 UPDATE 语句。

关于c# - 如何确定 Entity Framework 对象是否已更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9104553/

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