2011-06-18 49 views
4

這似乎比應該更難。如何將實體從EF代碼首先上下文中分離

我正在使用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構建的存儲庫類,並執行a

EventContext context = new EventContext(); 

然後將其用於存儲庫中,並且(我假設)在處置存儲庫時將其丟棄。 和EventRaces是一個全球可用的列表。

我的問題是,當我然後創建一個外鍵的註冊記錄返回到存儲在EventRaces中的RaceEvent時,我收到一個錯誤「一個實體對象不能被多個IEntityChangeTracker實例引用。

根據多篇博文和SO答案,我需要從上下文中分離緩存的實體,如Listing 1 of this post

我的問題是,使用ObjectBrowser,我找不到任何與Detach方法。存儲庫中的上下文沒有一個。上下文中的單個DbSets沒有(儘管它們有一個Attach()方法)。 System.Data.Object.ObjectSet有一個,但我找不到DbSet和ObjectSet之間的映射。

很明顯,我錯過了一些東西。有人能指出我正確的方向嗎?

回答

13

您可以使用AsNoTracking擴展方法來查詢您的列表沒有對象連接到環境...

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

...或者你可以通過設置自己的狀態,以上下文脫離單一實體Detached

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

AsNoTracking解決了我的問題。感謝您的快速響應。 –

+0

這會滲透到水印中的所有EF實體嗎?這意味着如果我擁有另一個實體作爲forigen鍵的實體嗎? –

+2

@EladBenda:對於'AsNoTracking':是的。將狀態設置爲'Detached':No. – Slauma