在EF 4.0中的几列实体上将IsModified设置为false

时间:2013-09-28 12:39:02

标签: c# entity-framework-4

如何在我的EntityObject的某些属性上将IsModified设置为false。

这是我的代码

message.To = message.To.Decrypt(encryptionKey);

现在我想设置message.To为IsModified = false,这样在保存更改时,EF将忽略对此列的更改。

我正在使用EF 4.0

2 个答案:

答案 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的功能。