2011-06-18 15 views
4

これは、はるかに難しいようです。エンティティをEFコードから切り離す方法最初のコンテキスト

MVC3、SQL Compact Edition、Entity Frameworks Code Firstを使用してイベント登録サイトを作成し、Steven SandersonのMvc Scaffolding NuGetパッケージを使用しています。

イベントのリストが大きく変化する可能性はないので、私はApplication_Startメソッドでグローバルリストにそれをキャッシュしています:

RaceEventRepositoryはMvcScaffoldingによって構築リポジトリクラスであり、かつ行い
 var repo = new RaceEventRepository(); 
      EventRaces = 
       repo.All.Where(r => r.RaceName.Contains(eventName)).Select(r => r).ToList(); 

a

EventContext context = new EventContext(); 

これは、リポジトリを介して使用され、リポジトリが処分されたときに処分されるものとします。 とEventRacesは、グローバルに利用可能なリストです。

私は、EventRacesに格納されているRaceEventに戻って外部キーを持つ登録レコードを作成すると、「エンティティオブジェクトはIEntityChangeTrackerの複数のインスタンスによって参照できません」というエラーが表示されます。

いくつかのブログ投稿とSOの回答によると、キャッシュされたエンティティをコンテキストからデタッチする必要があります(Listing 1 of this post)。

私の問題は、ObjectBrowserを使用して、Detachメソッドで何も見つかりませんでした。リポジトリのコンテキストにはリポジトリがありません。コンテキスト内の個々のDbSetsには(Attach()メソッドがありますが)1つもありません。 System.Data.Object.ObjectSetに1がありますが、DbSetとObjectSetの間のマッピングが見つかりません。

明らかに、私は何かが欠けています。誰かが私を正しい方向に向けることができますか?

あなたが

var repo = new RaceEventRepository(); 
EventRaces = repo.All.AsNoTracking() 
    .Where(r => r.RaceName.Contains(eventName)) 
    .ToList(); 

...コンテキストにオブジェクトを添付せずにあなたのリストを照会するAsNoTracking拡張メソッドを使用するか...またはあなたが設定によって文脈からその状態を単一のエンティティを切り離すことができ

答えて

13

Detached

context.Entry(raceEvent).State = EntityState.Detached; 
+0

AsNoTrackingが私の問題を解決しました。お返事ありがとうございます。 –

+0

これはhirarchyのすべてのEFエンティティに浸透しますか?私がエンジェルキーとして別のエンティティを持っているエンティティを持っていれば意味しますか? –

+2

@EladBenda: 'AsNoTracking'の場合:はい。状態を 'Detached'に設定する場合:いいえ – Slauma

関連する問題