我有一个叫做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
这个不成立。除非实体足够聪明,能够检测到只有一个字段从 15 更改为仅更改该字段?
如果实体与上下文分离,您将无法找出发生了什么变化,除非您从数据库重新加载原始实体,或者您正在使用自我跟踪实体或自己以某种方式管理跟踪。
如果您重新加载实体,您可以使用ApplyCurrentValues
:
var originalEntity = context.MyEntities.Single(e => e.Id == detachedEntity.Id);
context.MyEntities.ApplyCurrentValues(detachedEntity);
context.SaveChanges();
此方法将属性标记为已修改,这些属性在原始实体和分离实体之间具有不同的值。SaveChanges
将创建一个 UPDATE 语句,其中仅包含那些已更改的属性。如果没有属性发生变化,SaveChanges
什么也没做。
但是您并没有完全摆脱“不必要的流量”,因为您必须加载原始实体,但您将保存不必要的 UPDATE 语句。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)