为什么EF不持久化新值?
本文关键字:新值 持久化 不持久 EF 为什么 | 更新日期: 2023-09-27 18:10:47
问题:为什么这段代码没有将新的摘要值持久化到数据库?如果我省略了任何周围/相关的代码,请告诉我。
细节:
我对EF的实际操作经验很少,而且我刚刚继承了一个广泛使用它的代码库。这个扩展方法在代码库中,用法如下:
public static void SafeAttachTo<T>(this ObjectContext context, string entitySetName, ref T entity) where T : IEntityWithKey {
ObjectStateEntry entry;
bool attach;
if (context.ObjectStateManager.TryGetObjectStateEntry(context.CreateEntityKey(entitySetName, entity), out entry)) {
attach = entry.State == EntityState.Detached;
entity = (T) entry.Entity;
}
else
attach = true;
if (attach)
context.AttachTo(entitySetName, entity);
}
用法:
public int UpdateOrInsertWidget(Widget widget) {
if (widget.Id == 0) {
_context.Widgets.AddObject(widget);
} else {
_context.SafeAttachTo("Widgets", ref widget);
_context.ObjectStateManager.ChangeObjectState(widget, EntityState.Modified);
}
return _context.SaveChanges();
}
在某个时刻,用户更改了Widget
上的Summary(假设该类型具有Id
和Summary
属性……)我们将此实例命名为changedWidget
),从"Old Summary"到"New Summary"。
UpdateOrInsertWidget
被这样调用:
UpdateOrInsertWidget(changedWidget);
调用_context.SaveChanges();
后,数据库(SQL Server 2008)在Summary列显示"Old Summary"
当entity = (T) entry.Entity;
行传入时,它似乎覆盖了changedWidget
,这看起来很糟糕。
但是,没有更多的EF经验,我正在努力弄清楚这段代码需要改变什么。
我认为这里的问题是您的扩展方法只是将ObjectStateEntry
设置为"Modified"状态,但ObjectStateEntry
不知道已更改。
您应该使用的是ApplyOriginalValues
或ApplyCurrentValues
,这两种方法将"分离"对象的更改应用于现有ObjectContext
中的对象状态条目,并比较更改,以便ObjectContext
知道哪些特定属性发生了更改。
如果你将改变的实体附加到上下文,那么你需要ApplyOriginalValues
,以便上下文可以看到从原始到现在的变化。否则,您需要使用ApplyCurrentValues
。
您可以在这里阅读更多内容:http://msdn.microsoft.com/en-us/library/bb896248.aspx