我有像这样的poco类
public Profile
{
public virtual int ID
{
get;
set;
}
public virtual string Description
{
get;
set;
}
public virtual bool Enabled
{
get;
set;
}
}
当我尝试像这样更新时
var prof = new Profile(){ ID = 1, Enabled = false };
context.Profiles.Single (s => s.ID == 1);
context.Profiles.ApplyCurrentValues(prof);
context.SaveChanges();
Sql告诉我说Description不允许NULL,但是我没有更新“描述”列,我只想更新“已启用”字段。
怎么了?
韩国社交协会
答案 0 :(得分:2)
请改为尝试:
var prof = new Profile { ID = 1, Enabled = false };
// Attach prof as unchanged entity
context.Profiles.Attach(prof);
// Get state entry for prof
ObjectStateEntry entry = context.ObjectStateManager.GetObjectStateEntry(prof);
// Set only Enabled property to changed
entry.SetModifiedProperty("Enabled");
context.SaveChanges();
如您所见,我不需要首先从数据库加载实体。我能够设置在分离的实体上修改了哪个属性。
答案 1 :(得分:0)
基于我的评论:在不了解EF4的情况下,这就是我期望它发挥作用的方式:
var prof = context.Profiles.Single (s => s.ID == 1);
prof.Enabled = false;
context.Profiles.ApplyCurrentValues(prof);
context.SaveChanges();
假设Single
是Linq Single,那么它将返回一个你应该修改的值。
答案 2 :(得分:0)
这不起作用吗?
var prof = context.Profiles.Single(s => s.ID == 1);
prof.Enabled = false;
context.SaveChanges();
我认为问题在于你是从一个未跟踪的对象调用ApplyCurrentValues - 这意味着它不知道哪些属性有没有被更改,所以它只是复制到所有属性,包括null - 在您的情况下描述。
如果要修改从数据上下文加载的实体的值,则无需调用ApplyCurrentValues。