gpt4 book ai didi

c# - Entity Framework - 保存对分离实体所做的更改

转载 作者:行者123 更新时间:2023-12-02 22:06:48 25 4
gpt4 key购买 nike

假设已对 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 中的对象的属性值不同,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");

这将向仅设置 FirstName 列值的数据库发送一个 UPDATE 语句(同时将整个实体的状态设置为 Modified 将创建一个 UPDATE 语句,它将所有列值设置为当前属性值)。

关于c# - Entity Framework - 保存对分离实体所做的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15981090/

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