我有两个实体:Product和StockItem 当我插入产品时 - 我必须更新相关的StockItem 当我删除产品时 - 我也必须更新相关的StockItem。
我的问题是在产品更新(修改)的情况下更新库存商品。为了更新相关的StockItem,我需要知道Product实体中名为Group的字段是否已更改。为此,我必须比较实体的修改版本和实体的未修改版本。但每当我要求实体时 - 实体框架返回附加的实体(而不是数据库中的旧实体)。
如何让实体框架返回实体的旧版本/当前db版本(更改前)?
答案 0 :(得分:3)
您看到的是ORM工具使用identity map pattern的结果。具有唯一实体密钥的每个实体只能附加到上下文一次=您永远不会有两个版本的实体,同一个实体密钥加载两次到同一个上下文。
默认情况下,如果查询返回具有相同实体键的记录,则EF始终返回已加载的实例。可以更改此行为,但您仍然只有该实体的单个实例。
您是否使用与要用于保存的相同上下文实例从EF加载实体?如果是,那么您已经拥有旧值。使用:
ObjectStateEntry entry = objectContext.ObjectStateManager.GetObjectStateEntry(yourEntity);
int someIntProperty = (int)entry.OriginalValues["SomeIntProperty"];
如果你没有从同一个上下文加载实体,你仍然可以使用这种方法,但在此之前你必须强制EF重新加载原始值:
objectContext.YourEntitySet.MergeOption = MergeOption.PreserveChanges;
YourEntity entity = objectContext.YourEntitySet.Single(e => e.Id == entityId);
现在,条目中的OriginalValues
集合将从数据库中填充。
另一个解决方案是简单地使用两个不同的上下文 - 一个用于当前实体状态,一个用于旧实体状态。