繁体   English   中英

实体框架-保存对独立实体所做的更改

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM