自我跟踪poco

时间:2011-04-20 22:43:50

标签: c# entity-framework-4 poco

我有像这样的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,但是我没有更新“描述”列,我只想更新“已启用”字段。

怎么了?

韩国社交协会

3 个答案:

答案 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。