【问题标题】:Self tracking poco自我追踪 poco
【发布时间】:2011-04-20 22:43:49
【问题描述】:

我有一个像这样的 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,但我没有更新“Description”列,我只想更新“Enabled”字段。

怎么了?

Tks

【问题讨论】:

  • 在您的更新代码中,第二行是否更改了第三行处理的对象?真的似乎第二行对第三行没有任何影响(至少,我期望它是这样工作的)。
  • Austin,第二行是将我的分离寄存器与持久寄存器关联起来

标签: c# entity-framework-4 poco


【解决方案1】:

试试这个:

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

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

【讨论】:

  • 它有效,tks。我正在考虑更改 t4 模板以添加 entry.SetModifiedProperty("PropName");关于所有属性,您怎么看?
  • 那么它将与将整个实体设置为修改状态相同=所有属性都将被更新。
  • 是的,但如果属性的值发生了变化,我只会调用 entry.SetModifiedProperty("PropName")
【解决方案2】:

根据我的评论:在不了解 EF4 的情况下,这就是我期望它的工作方式:

var prof = context.Profiles.Single (s => s.ID == 1);
prof.Enabled = false;
context.Profiles.ApplyCurrentValues(prof);
context.SaveChanges();

假设Single 是Linq Single,那么它将返回一个您应该修改的值。

【讨论】:

  • 这种方式可行,但 ef 仍在为所有列生成更新
【解决方案3】:

这不行吗?

var prof = context.Profiles.Single(s => s.ID == 1);
prof.Enabled = false;
context.SaveChanges(); 

我认为问题在于您正在从未跟踪的对象调用 ApplyCurrentValues - 这意味着它不知道哪些属性已更改和未更改,因此它只是复制 all属性,包括那些为空的 - 在你的情况下是描述。

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

【讨论】:

  • 它可以工作,但我的最终用户无权访问数据上下文。我的商务舱让实体分离
猜你喜欢
  • 2011-08-24
  • 1970-01-01
  • 2011-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-25
  • 2016-08-31
相关资源
最近更新 更多