使用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时,如果newPublishedValue
为true
,则此方法有效,但如果newPublishedValue
为false
,则不会对数据库进行任何更改。同样,此模式不会将整数值设置为0.
这里发生了什么?
更换
c.Messengers.Attach(cm);
与
c.Entry(cm).State = System.Data.EntityState.Modified;
修复了这个问题,但是如果EF5不会更新我的new Data.Messenger
属性的默认结构值,那么这不会使Attach
方法变得有点无用吗?
我在这里缺少什么?
答案 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;