Stub Entity的实体框架代码第一次更新

时间:2010-12-14 15:46:48

标签: entity-framework ef-code-first

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

e.g。

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();

上面的代码是否会创建一个Update Statement,它会使DinnerID 1行的以下列为null?

  

标题,EventDate,地址,国家

有没有像“PropertyModified”= true的方式或方法,那么其余的使得它们= false,以便HostedBy是唯一会更新的?

5 个答案:

答案 0 :(得分: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上的备注部分:

  

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

那是你的追求吗?

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

仅供参考我原来的问题,如果在这里找到答案:

Update a single property of a record in Entity Framework Code First

它还包含如何暂时禁用验证 - 非常有用,尤其是如果您使用EF Power Tools对数据库进行反向工程以编写第一个类的代码。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

尝试这个可能,它特定于EF Code First,它似乎与EF不同。

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

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

context.SaveChanges();

来自ADO.NET team blog

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