C# 自跟踪poco

C# 自跟踪poco,c#,entity-framework-4,poco,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

我有一个像这样的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();
当我尝试像这样更新时

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告诉我描述不允许NULL,但我不更新“描述”列,我只想更新“已启用”字段

怎么了


Tks

根据我的评论:在不了解EF4的情况下,我希望它能这样工作:

var prof = context.Profiles.Single (s => s.ID == 1);
prof.Enabled = false;
context.Profiles.ApplyCurrentValues(prof);
context.SaveChanges();
假设
Single
是Linq Single,那么它将返回一个您应该修改的值。

这不起作用吗

var prof = context.Profiles.Single(s => s.ID == 1);
prof.Enabled = false;
context.SaveChanges(); 
我认为问题在于,您正在从未跟踪的对象调用ApplyCurrentValues-这意味着它不知道哪些属性已更改,哪些属性未更改,因此它只是跨所有属性进行复制,包括在您的案例描述中为空的属性

如果要修改从数据上下文加载的实体的值,则无需调用ApplyCurrentValues。

请尝试以下操作:

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

如您所见,我不需要首先从数据库加载实体。我可以设置在分离的实体上修改了哪个属性。

在更新代码中,第二行是否更改了第三行处理的对象?第二行似乎对第三行没有任何影响(至少,我希望它是这样工作的)。Austin,第二行是将我分离的寄存器与持久化的寄存器关联起来。这种方式可行,但ef仍在为所有列生成更新。这是可行的,但我的最终用户无法访问数据上下文。我的商务类得到了编辑工作的实体,tks。我正在考虑更改t4模板以添加entry.SetModifiedProperty(“PropName”);在所有属性上,您认为如何?然后它将与将整个实体设置为修改状态相同=所有属性都将更新。是的,但如果属性的值已更改,我将仅调用entry.SetModifiedProperty(“PropName”)