4

使用 Entity Framework 5,给定一个messenger存在于数据库中的对象,具有位属性published,在以前的 EF 版本中,我会像这样更新它:

using (var c = new EFContext())
{
    Data.Messenger cm = new Messenger { MessageId = messageId };
    c.Messengers.Attach(cm);
    cm.Published = newPublishedValue;
    c.SaveChanges();
}

但是,使用 EF5,如果是,则此方法有效newPublishedValuetrue但如果newPublishedValuefalse,则不会对数据库进行任何更改。同样,此模式不会将整数值设置为 0。

这里发生了什么?

更换

c.Messengers.Attach(cm);

c.Entry(cm).State = System.Data.EntityState.Modified;

修复了这个问题,但是如果 EF5 不会更新我new Data.Messenger的默认结构值的属性,那不是让该Attach方法有点没用吗?

我在这里想念什么?

4

1 回答 1

2

它仅在以前的版本中有效,可能是当您使用派生自EntityObjectPOCO 的实体或具有动态代理更改跟踪的 POCO 时。Modified在这种情况下,无论旧值是什么,当您分配一个值(= 调用 setter)时,该属性设置器都会被设置该属性标志的代码覆盖。

在没有动态更改跟踪代理的情况下使用 POCO,它不起作用 - 对于任何版本的 EF - 因为属性设置器只是实体类中数据字段的分配。更改跟踪通过快照更改跟踪进行,这意味着 EF 将您调用时获取的实体快照的Attach值与调用时实体具有的值进行比较SaveChanges。如果值未更改,EF 未检测到更改并且不为属性编写 UPDATE 语句。

Attach仅用于将实体添加到Unchanged状态中的上下文中。在您的情况下,您必须Modified明确标记该属性以确保它将在数据库中更新,无论旧值是什么:

c.Entry(cm).Property(x => x.Published).IsModified = true;
于 2012-10-12T17:13:18.290 回答