我读了不少关于这个的帖子,我看不出我的情况有什么不同,但肯定是因为它仍然没有更新。
基本上,我的方法接收消息中的分离实体。我检查它的键是否已经存在。如果它不存在,我将它添加到数据库中。如果它存在,我想更新它的值。
下面是我的代码: InteropObject clientObject = (InteropObject)message.ItemToAddUpdate;
bool exists = context.InteropObjects.Any(o => o.GUID == clientObject.GUID);
if (!exists)
{
context.InteropObjects.AddObject(clientObject);
}
else
{
context.Attach(clientObject);
context.ObjectStateManager.GetObjectStateEntry(clientObject).SetModified();
}
context.SaveChanges();
谢谢你的帮助!
问题是,在旧的ObjectContext
API中,将状态设置为Modified
不会将实体的属性设置为Modified
。在DbContext
API中,这是通过调用内部修复的。
ObjectContext
API中,您可以通过设置附加实体的属性来获得相同的效果:
context.Attach(clientObject);
var ose = context.ObjectStateManager.GetObjectStateEntry(clientObject);
// Obtain an object array containing current values
var values = new object[ose.CurrentValues.FieldCount];
ose.CurrentValues.GetValues(values);
// "Overwrite" CurrentValues by these values:
ose.CurrentValues.SetValues(values);
因此,您可以根据属性已有的值设置属性,但这会触发状态管理器将属性标记为Modified
。