4

これは、本来よりもはるかに難しいようです。

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

イベントのリストはあまり変更されない可能性が高いため、Application_Start メソッドのグローバル リストにキャッシュしています。

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

ここで、RaceEventRepository は MvcScaffolding によって構築されたリポジトリ クラスであり、

EventContext context = new EventContext();

その後、リポジトリ全体で使用され、(私が推測するに) リポジトリが破棄されるときに破棄されます。EventRaces はグローバルに利用可能なリストです。

私の問題は、 EventRaces に保存されている RaceEvent への外部キーを使用して登録者レコードを作成すると、「IEntityChangeTracker の複数のインスタンスでエンティティ オブジェクトを参照できません」というエラーが発生することです。

いくつかのブログ投稿と SO の回答によると、この投稿のリスト 1 のように、キャッシュされたエンティティをコンテキストから切り離す必要があります。

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

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

4

1 に答える 1

15

AsNoTracking拡張メソッドを使用して、オブジェクトをコンテキストにアタッチせずにリストをクエリできます...

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

Detached...または、状態を次のように設定することで、単一のエンティティをコンテキストから切り離すことができます。

context.Entry(raceEvent).State = EntityState.Detached;
于 2011-06-18T19:07:10.220 に答える