附加和更新boolean或int并不总是有效

时间:2012-10-12 08:56:13

标签: c# .net entity-framework entity-framework-5

使用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方法变得有点无用吗?

我在这里缺少什么?

1 个答案:

答案 0 :(得分:2)

它只适用于以前的版本,可能是因为您使用了从EntityObject或POCO派生的实体和动态代理更改跟踪。在这种情况下,属性设置器被覆盖,代码在您分配值(=调用setter)时为此属性设置Modified标志,无论旧值是什么。

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

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

c.Entry(cm).Property(x => x.Published).IsModified = true;