7

是否可以在 EF Code-First 中使用存根对象在不查询 db 中的整行的情况下进行更新,...

例如

public class Dinner 
{     
    public int DinnerID { get; set; }     
    public string Title { get; set; }     
    public DateTime EventDate { get; set; }     
    public string Address { get; set; }     
    public string Country { get; set; }     
    public string HostedBy { get; set; }       
}



Dinner dinner = dinner.DinnerID = 1;     
dinner.HostedBy = "NameChanged" 
nerdDinners.SaveChanges();

上面的代码是否会创建一个更新语句,这将使 DinnerID 1 的行的以下列为空?

标题、事件日期、地址、国家

有没有像“PropertyModified” = true 的方式或方法,然后其余的使它们 = false,以便 HostedBy 是唯一将被更新的?

4

4 回答 4

4

认为您正在寻找ApplyCurrentValues

public void UpdateDinner(Dinner existingDinner)
{
    var stub = new Dinner { DinnerId = existingDinner.DinnerId };
    ctx.Dinners.Attach(stub);
    ctx.ApplyCurrentValues(existingDinner);
    ctx.SaveChanges();
}

ApplyCurrentValues量值从现有对象复制到图中的对象(在上述情况下 - 存根实体)。

从MSDN 上的备注部分:

任何不同于对象原始值的值都被标记为已修改。

那是你的追求吗?

于 2010-12-15T10:07:15.470 回答
1

为了建立保罗的答案,当您使用 EF 模型或数据库优先时,以下内容将起作用:

context.ObjectStateManager.GetObjectStateEntry(dinner).SetModifiedProperty("HostedBy");
于 2011-06-21T21:58:23.777 回答
0

我认为您正在寻找Attach()方法。

于 2010-12-15T09:44:11.727 回答
0

也许试试这个,它特定于 EF Code First,它似乎与 EF 不同。

var dinner = context.Dinners.Find(1);

context.Entry(dinner).Property(d => d.HostedBy).IsModified = true;

context.SaveChanges();

来自ADO.NET 团队博客

“将属性标记为已修改会在调用 SaveChanges 时强制将更新发送到属性的数据库,即使属性的当前值与其原始值相同。”

于 2011-02-03T21:02:36.750 回答