[英]Entity Framework - Saving changes made to a detached entity
说在EF 4中对一个分离的实体进行了更改。如果我们在重新连接该实体时要保存这些更改,是否可以使用ApplyCurrentValues进行此操作而无需查询数据库来获取原始实体? 我不这么认为,但我希望有人确认这一点。
using (var ctx = new BAEntities())
{
var firstCust = (from c in ctx.Contacts select c).First();
Console.WriteLine(firstCust.FirstName);
ctx.Contacts.Detach(firstCust);
firstCust.FirstName = "Modified Value";
ctx.Contacts.Attach(firstCust);
ctx.ApplyCurrentValues("Contacts", firstCust);//Does not work
//ctx.ObjectStateManager.ChangeObjectState(firstCust, EntityState.Modified); //Works with that line
ctx.SaveChanges( );
}
谢谢
我可以证实你的猜测。 这样行不通。
当您调用带有实体作为参数的Attach
,EF将实体添加到状态为Unchanged
的上下文中。 基本上,您通过Attach
告诉EF实体当时具有的所有属性值都代表数据库中的当前值。
ApplyCurrentValues
是一种“自动映射器”,它只是将您传递到ApplyCurrentValues
中的对象的属性值ApplyCurrentValues
到具有相同键的附加实体。 该副本基于属性名称发生。
如果附加实体的属性值与您传递给ApplyCurrentValues
的对象的属性值不同,则EF将该属性标记为Modified
。 如果不是,状态保持Unchanged
。 显然,在您的过程中,所有属性状态都将保持不变,并且不会将任何内容写入数据库。
从理论上讲,您可以做一些疯狂的事情来使其像:
firstCust.FirstName = "Modified Value";
var dummyCust = new Contact { FirstName = "UnlikelyNameThatWillNeverOccur" };
ctx.Contacts.Attach(dummyCust);
ctx.ApplyCurrentValues("Contacts", firstCust);
在这里, FirstName
属性将标记为Modified
。 但是您必须对每个属性都执行此操作,结果将与在注释代码行中将整个实体的状态设置为“已Modified
相同。
您可以将单个属性设置为Modified
:
ctx.Contacts.Attach(firstCust);
ctx.ObjectStateManager.GetObjectStateEntry(firstCust)
.SetModifiedProperty("FirstName");
这会将UPDATE语句发送到仅设置FirstName
列值的数据库(将整个实体的状态设置为Modified
将创建一个UPDATE语句,该语句将所有列值设置为当前属性值)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.