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

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

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

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

这里发生了什么?

更换

 c.Messengers.Attach(cm); 

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

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

我在这里想念的是什么?

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

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

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

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