使用 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
is true
,但如果newPublishedValue
is false
,不对数据库进行任何更改。同样,此模式不会将整数值设置为 0。
这里发生了什么?
更换
c.Messengers.Attach(cm);
with
c.Entry(cm).State = System.Data.EntityState.Modified;
修复了问题,但如果 EF5 不会更新我的属性new Data.Messenger
具有默认结构值,这不会渲染Attach
方法有点没用?
我在这里缺少什么?
它仅在以前的版本中起作用,可能当您使用派生自的实体时EntityObject
或具有动态代理更改跟踪的 POCO。在这种情况下,属性设置器将被设置属性的代码覆盖Modified
当您分配值(= 调用 setter)时,无论旧值是什么,都会对此属性进行标记。
使用没有动态更改跟踪代理的 POCO 是行不通的 - 对于任何版本的 EF - 因为属性设置器只是实体类中数据字段的分配。更改跟踪通过快照更改跟踪进行,这意味着 EF 会比较您调用时拍摄的实体快照的值Attach
与您调用时实体具有的值SaveChanges
。如果值没有更改,EF 不会检测到任何更改,并且不会为该属性编写 UPDATE 语句。
Attach
仅用于将实体添加到上下文中Unchanged
状态。在您的情况下,您必须将该财产标记为Modified
明确地确保它将在数据库中更新,无论旧值是什么:
c.Entry(cm).Property(x => x.Published).IsModified = true;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)