11

ChangeTracker(元の値だけでなく)元のエンティティ自体を取得する方法はありますか?

Stateが である場合、Modified私はこれを行うことができると思います:

// 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);

しかし、これはあまり良くないように思えます。私が知らない問題があると確信しています...もっと良い方法はありますか?

Entity Framework 6 を使用しています。

4

4 に答える 4

23

SaveChangesDbContext のオーバーライドまたはChangeTrackerコンテキストからのアクセス:

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;
}
于 2013-02-21T21:34:14.570 に答える
1

マテリアライゼーションでエンティティを複製し、それらを2番目のコンテキストにアタッチして、元のオブジェクト全体のグラフを保持することをお勧めします(もちろん必要な場合)。T4 テンプレートを変更することで、それらをすべて ICloneable にすることができます。

于 2013-02-22T11:52:11.193 に答える
-1

EF 6 で作業している間、次のコードを使用して、基になる POCO エンティティ タイプをプロキシ タイプから取得しました。

var entityType = ObjectContext.GetObjectType(dbEntitymodifiedEntry.Entity.GetType());

ObjectContext.GetObjectType: プロキシ オブジェクトから POCO を返します

于 2015-04-30T15:08:18.487 に答える