如何从 ChangeTracker 获取原始实体

How to get original Entity from ChangeTracker(如何从 ChangeTracker 获取原始实体)
本文介绍了如何从 ChangeTracker 获取原始实体的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有没有办法从 ChangeTracker 中获取原始实体本身(而不仅仅是原始值)?

Is there a way to get the original Entity itself from the ChangeTracker (rather than just the original values)?

如果 StateModified,那么我想我可以这样做:

If the State is Modified, then I suppose I could do this:

// Get the DbEntityEntry from the DbContext.ChangeTracker...

// Store the current values
var currentValues = entry.CurrentValues.Clone();

// Set to the original values
entry.CurrentValues.SetValues(entry.OriginalValues.Clone());

// Now we have the original entity
Foo entity = (Foo)entry.Entity;

// Do something with it...

// Restore the current values
entry.CurrentValues.SetValues(currentValues);

但这似乎不太好,而且我确定它存在我不知道的问题......有没有更好的方法?

But this doesn't seem very nice, and I'm sure there are problems with it that I don't know about... Is there a better way?

我正在使用实体框架 6.

I'm using Entity Framework 6.

推荐答案

覆盖 DbContext 的 SaveChanges 或仅从上下文访问 ChangeTracker:

Override SaveChanges of DbContext or just access ChangeTracker from the context:

foreach (var entry in context.ChangeTracker.Entries<Foo>())
{
    if (entry.State == System.Data.EntityState.Modified)
    {
        // use entry.OriginalValues
        Foo originalFoo = CreateWithValues<Foo>(entry.OriginalValues);
    }
}

<小时>

这是一个使用原始值创建新实体的方法.因此所有实体都应该有一个无参数的公共构造函数,你可以简单地用 new 构造一个实例:

private T CreateWithValues<T>(DbPropertyValues values)
    where T : new()
{
    T entity = new T();
    Type type = typeof(T);

    foreach (var name in values.PropertyNames)
    {
        var property = type.GetProperty(name);
        property.SetValue(entity, values.GetValue<object>(name));
    }

    return entity;
}

这篇关于如何从 ChangeTracker 获取原始实体的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

DispatcherQueue null when trying to update Ui property in ViewModel(尝试更新ViewModel中的Ui属性时DispatcherQueue为空)
Drawing over all windows on multiple monitors(在多个监视器上绘制所有窗口)
Programmatically show the desktop(以编程方式显示桌面)
c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
LINQ many-to-many relationship, how to write a correct WHERE clause?(LINQ多对多关系,如何写一个正确的WHERE子句?)