0

EntityFramework4.1を使用しています。オンラインで多くの例を使用してベースリポジトリを実装しました。私のリポジトリのgetメソッドは、エンティティを追跡するかどうかを決定するためにboolパラメーターを取ります。エンティティをロードして追跡したい場合もあれば、単にそれらを読み取って(つまりグラフに)表示したい場合もあります。この状況では編集する必要がないので、それらを追跡するオーバーヘッドは必要ありません。また、グラフエンティティはSilverlightクライアントに送信されるため、エンティティはコンテキストから切断されます。したがって、私のGetメソッドは、追跡されているかどうかに関係なく、エンティティのリストを返すことができます。これは、次のようにクエリを動的に作成することで実現されます。

DbQuery<E> query = Context.Set<E>();

 // Track the entities in the context?
 if (!trackEntities)
 {
    query = query.AsNoTracking();
 }

ただし、ユーザーがグラフを操作して編集できるようにしたいと思います。これはあまり頻繁には発生しないので、追跡せずにいくつかのエンティティを取得したいのですが、それらを保存する機能が必要です。これを行うには、それらをコンテキストにアタッチし、状態を変更済みとして設定するだけです。これまでのところすべてが機能しています。

SaveChangesメソッドをオーバーライドして、変更を監査しています。上で説明したように、場合によっては、切断された変更済みエンティティを保存する必要があります。したがって、監査するには、データベースから現在の値を取得してから、切断中に何が変更されたかを比較する必要があります。エンティティが追跡されている場合は、状態マネージャーを介して古い値にアクセスできるため、古い値を取得する必要はありません。私は自己追跡エンティティを使用していません。これは私の要件にとってやり過ぎだからです。

質問:私の監査方法では、変更されたエンティティが追跡されているかどうかを知りたいだけです。つまり、データベースに移動して元の値を取得する必要がありますか?

乾杯

4

1 に答える 1

2

DbContext.ChangeTracker.Entries(http://msdn.microsoft.com/en-us/library/gg679172 (v=vs.103 ).aspx)は、追跡されているすべてのエンティティのDbEntityEntryオブジェクトを返します。DbEntityEntryには、エンティティが追跡されているかどうかを確認するために使用できるEntityプロパティがあります。何かのようなもの

var isTracked = ctx.ChangeTracker.Entries().Any(e => Object.ReferenceEquals(e.Entity, myEntity));
于 2012-06-18T16:52:18.473 に答える