是否可以在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是唯一会更新的?
答案 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();
“将属性标记为已修改会强制在调用SaveChanges时将更新发送到属性的数据库,即使该属性的当前值与其原始值相同。”