使用存根实体进行Entity Framework Code First更新

7
在EF Code-First中,是否可以使用存根对象而无需查询整个行来更新数据库?
例如:
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

认为你正在寻找ApplyCurrentValues

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

ApplyCurrentValues会将现有对象中的标量值复制到图形中的对象(在上面的情况下是存根实体)。

来自MSDN的备注部分:

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

这符合您的要求吗?


为什么我找不到 ApplyCurrentValues() 方法?该方法不存在。 - Shawn Mclean

1

在Paul的回答基础上,当您使用EF模型或数据库优先时,以下内容将起作用:

context.ObjectStateManager.GetObjectStateEntry(dinner).SetModifiedProperty("HostedBy");

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时强制向数据库发送更新,即使属性的当前值与其原始值相同。”


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接