使用Entity Framework 5,给定一个存在于数据库中的对象信使,发布了比特属性,在以前版本的EF中,我会像这样更新它:
using (var c = new EFContext())
{
Data.Messenger cm = new Messenger { MessageId = messageId };
c.Messengers.Attach(cm);
cm.Published = newPublishedValue;
c.SaveChanges();
}
但是,如果newPublishedValue为true,则使用EF5,但如果newPublishedValue为false,则不对数据库进行任何更改.同样,此模式不会将整数值设置为0.
这里发生了什么?
更换
c.Messengers.Attach(cm);
同
c.Entry(cm).State = System.Data.EntityState.Modified;
修复了这个问题,但是如果EF5不会更新我的新Data.Messenger的属性,这些属性是默认的struct值,那么不会使Attach方法变得有点无用吗?
我在这里错过了什么?
最佳答案 它只适用于以前的版本,可能是因为您使用了从EntityObject或POCO派生的实体和动态代理更改跟踪.在这种情况下,属性设置器被重写,代码在您分配值(=调用setter)时为该属性设置Modified标志,无论旧值是什么.
使用没有动态变更跟踪代理的POCO它不起作用 – 对于没有EF版本 – 因为属性设置器只是实体类中数据字段的赋值.快照更改跟踪会发生更改跟踪,这意味着EF会将您调用Attach时实体的快照值与实体在调用SaveChanges时所具有的值进行比较.如果值未更改,则EF检测到没有更改,并且不会为该属性写入UPDATE语句.
Attach仅用于将实体添加到Unchanged状态的上下文中.在您的情况下,您必须将属性显式标记为已修改,以确保它将在数据库中更新,无论旧值是什么:
c.Entry(cm).Property(x => x.Published).IsModified = true;