如何在我的 EntityObject 的某些属性上将 IsModified 设置为 false。
这是我的代码
message.To = message.To.Decrypt(encryptionKey);
现在我想将 message.To 设置为 IsModified=false,以便在保存更改时,EF 将忽略对此列的更改。
我正在使用 EF 4.0
如何在我的 EntityObject 的某些属性上将 IsModified 设置为 false。
这是我的代码
message.To = message.To.Decrypt(encryptionKey);
现在我想将 message.To 设置为 IsModified=false,以便在保存更改时,EF 将忽略对此列的更改。
我正在使用 EF 4.0
有趣的问题!据我所知,EF 4.0并没有这样直接的解决方案(幸运的是,EF 的后续版本很好地解决了这个问题)。
无论如何,我将分三个阶段解决这个问题:
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
'sSET
子句中排除
var entry = context.ObjectStateManager.GetObjectStateEntry(message);
entry.ChangeState(EntityState.Unchanged);
3-将先前修改的属性标记为Modified
除To
属性
modifiedProps.ForEach(p=> entry.SetModifiedProperty(p));
最后通过保存您的更改context.SaveChanges();
编辑:
我忘记To
在第 1 步中排除属性。现在已更正
以下为我完成了这项工作
解密属性后立即写下一行
_db.ObjectStateManager.ChangeObjectState(message, EntityState.Unchanged);
将整个对象设置为未修改。虽然这不是我要求的,但 EF 4.0 不提供直接将属性设置为未更改的工具。