2012-04-18 10 views
2

エンティティモデルからデータが取り込まれています。これにはアイテムの属性が含まれています。最高速度、重量、サイズのカーパーツを考えてみましょう。多くのパーツがあり、ベース属性が決して変化しないので、私はすべてのレコードをキャッシュしました。エンティティのフレームワークとキャッシング - 変更がキャッシュに戻ってトラッキングされています

これらのパーツが使用されているかどうかによって、これらの属性が変更される可能性があるので、新しい車をセットアップし、キャッシュされたアイテム「Engine」から新しい車のオブジェクトに値をコピーしてから「TurboCharger」エンジンの最大速度、重量、サイズを向上させます。

私が遭遇している問題は、エンティティモデルがまだコンテキストを追跡しているようだということです。キャッシュされたデータに戻っています。したがって、ローカルメソッドでウェイトを増やすと、すべてのユーザーがウェイトを増やします。私は"MergeOption.NoTracking"を私のコンテキストに追加しようとしました。これは、すべてのエンティティトラッキングを削除するはずですが、それでもトラッキングを行っているようです。キャッシュをオフにすると、毎回新しい値がデータベースから取得されるため、正常に動作します。

エンティティモデルからレコードをコピーしたい場合は、「オブジェクトをコピーしますがエンティティからの履歴がない標準オブジェクトとして扱う」と言うことができますアイテムから、それは単なる平らなオブジェクトですか?

乾杯!

答えて

2

MergeOption.NoTrackingについては、コンテキスト全体で正確にはわかりませんが、代わりに行うことができるのはデータベースからクエリに.AsNoTracking()を追加することです。これは間違いなく切り離されたオブジェクトを返します。 AsNoTrackingの使用についての詳細はこちらをご覧ください:http://blog.staticvoid.co.nz/2012/04/entity-framework-and-asnotracking.html

もう1つは、キャッシュに挿入する前にコレクションを列挙して、クエリ可能な範囲内で動作していないことを確認することです。つまり、.ToArray()を使用します。

他のオプションは、(Detach(Tエンティティ)を使用して)コンテキストからオブジェクトを手動で切り離すことです。

+0

以前は.NoTrackingを使用してみましたが、これはDbContextを使用している場合にのみ発生すると思います。しかし、Detach(Tエンティティ)について言及しました。私は自分のレコードを取り出し、デタッチをコンテキスト上で実行しました(コンテキストではなく、返されたオブジェクト上で実行しましたが、いつも私はキャッシュしていました)。ありがとうございます! :D – boolean

関連する問題