0

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

这是我的代码

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

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

我正在使用 EF 4.0

4

2 回答 2

1

有趣的问题!据我所知,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-将先前修改的属性标记为ModifiedTo属性

modifiedProps.ForEach(p=> entry.SetModifiedProperty(p));

最后通过保存您的更改context.SaveChanges();

编辑:

我忘记To在第 1 步中排除属性。现在已更正

于 2013-09-28T13:24:20.763 回答
0

以下为我完成了这项工作

解密属性后立即写下一行

_db.ObjectStateManager.ChangeObjectState(message, EntityState.Unchanged);

将整个对象设置为未修改。虽然这不是我要求的,但 EF 4.0 不提供直接将属性设置为未更改的工具。

于 2013-09-30T05:07:48.417 回答