C# 在更改之前获取实体
我有两个实体:产品和库存项目。C# 在更改之前获取实体,c#,.net,entity-framework,C#,.net,Entity Framework,我有两个实体:产品和库存项目。 插入产品时,我必须更新相关库存项目。 当我删除产品时,我还必须更新相关的库存项目 我的问题是在产品更新(修改)时更新库存项目。为了更新相关的StockItem,我需要知道产品实体中名为Group的字段是否已更改。为此,我必须比较实体的修改版本和未修改版本。但每当我请求实体时,实体框架都会返回附加的实体(而不是数据库中的旧实体) 如何要求实体框架返回实体的旧版本/当前db版本(更改前)?您看到的是ORM工具使用的结果。每个具有唯一实体键的实体只能附加到上下文一次=您
插入产品时,我必须更新相关库存项目。
当我删除产品时,我还必须更新相关的库存项目 我的问题是在产品更新(修改)时更新库存项目。为了更新相关的StockItem,我需要知道产品实体中名为Group的字段是否已更改。为此,我必须比较实体的修改版本和未修改版本。但每当我请求实体时,实体框架都会返回附加的实体(而不是数据库中的旧实体) 如何要求实体框架返回实体的旧版本/当前db版本(更改前)?您看到的是ORM工具使用的结果。每个具有唯一实体键的实体只能附加到上下文一次=您永远不会将具有相同实体键的实体的两个版本加载到同一上下文两次 默认情况下,如果查询返回具有相同实体键的记录,则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
集合将从数据库中填充
另一种解决方案是简单地使用两种不同的上下文——一种用于当前实体状态,另一种用于旧实体状态