如何在Entity Framework中获取实体的原始值?

Jat*_*ing 19 entity entity-framework-4

在EF 4.0中,如果我理解正确,实体中有两种类型的值:当前值和原始值.
我们可以通过调用ApplyOriginalValues(TEntity)方法设置原始值但是如何获取原始值?

Leo*_*lva 31

对于EF 5,@ Eranga答案已经过时.出于某种原因,当使用如下语句获取原始值时,EF 5无法正常工作:

var originalValues = context.Entry(myEntity).OriginalValues;
Run Code Online (Sandbox Code Playgroud)

我的工作解决方案使用AsNoTracking()方法DbSet,如下例所示:

var originalEntity = context.MyEntities.AsNoTracking().FirstOrDefault(me => me.MyEntityID == myEntity.MyEntityID);
Run Code Online (Sandbox Code Playgroud)

  • 请注意,AsNoTracking将从DB读取实体.它可能已被并发任务更改,在这种情况下您可能会继续处理不正确的数据... (2认同)

Era*_*nga 14

您可以通过ObjectStateEntry访问它们

var originalValues = context
         .ObjectStateManager.GetObjectStateEntry(myEntity).OriginalValues;
Run Code Online (Sandbox Code Playgroud)


小智 6

这可以进一步细化到以下内容:

var originalEntity = context.MyEntities.AsNoTracking()
         .FirstOrDefault(me => me.MyEntityID == myEntity.MyEntityID);
Run Code Online (Sandbox Code Playgroud)

Where上面,好,响应不需要.


小智 5

var originalEntity = (EntityType)context.Entry(editEntity).OriginalValues.ToObject();
Run Code Online (Sandbox Code Playgroud)

对不起我的英语不好。通过这种方式,您可以在不更改编辑值的情况下以对象实体的形式获取原始实体值。

示例:如果你喜欢编辑一个人,顶部的行看起来像这样

var originalPerson = (Person)context.Entry(editPerson).OriginalValues.ToObject();
Run Code Online (Sandbox Code Playgroud)