如何在我的EntityObject的某些属性上将IsModified设置为false。
这是我的代码
message.To = message.To.Decrypt(encryptionKey);
现在我想设置message.To为IsModified = false,这样在保存更改时,EF将忽略对此列的更改。
我正在使用EF 4.0
答案 0 :(得分:1)
有趣的问题!据我所知, EF 4.0 没有这么简单的解决方案(幸运的是,后来的版本以很好的方式解决了这个问题)。
无论如何,我将在3个阶段解决这个问题:
1 - 如果message
已附加到上下文,并且自附件修改后,我们首先将其修改后的属性记录在列表中
var modifiedProps = context.ObjectStateManager.GetObjectStateEntry(message).GetModifiedProperties().Where(p=>p.Equals('To')==false).ToList();
如果没有附上,我们附上
context.Attach(message); // the sate of the message will be UnChanged
var modifiedList = any property changed based on what you have done so far;
2-将对象的状态更改为UnChanged
,这样每个属性都会从Update
的{{1}}子句中排除
SET
3-将以前修改过的属性标记为var entry = context.ObjectStateManager.GetObjectStateEntry(message);
entry.ChangeState(EntityState.Unchanged);
,但Modified
属性
To
最后通过modifiedProps.ForEach(p=> entry.SetModifiedProperty(p));
修改强>
我忘了在第1步中排除属性context.SaveChanges();
。它现在已经更正
答案 1 :(得分:0)
以下为我做了这份工作
在解密属性后立即写下以下行
_db.ObjectStateManager.ChangeObjectState(message, EntityState.Unchanged);
将整个对象设置为未修改。虽然这不是我要求的,但EF 4.0不提供直接将Property设置为Unchanged的功能。