2009-12-01 47 views
0

我使用EF1.0時出現了一個奇怪的問題......我的問題碰巧只在創作過程中,而我沒有在許多論壇的主題上找到任何內容。在創作期間使用EF 1.0

 
> System.InvalidOperationException: The source query for this EntityCollection or EntityReference cannot be returned when the related object is in either an added state or a detached state and was not originally retrieved using the NoTracking merge option. 
    at System.Data.Objects.DataClasses.RelatedEnd.CreateSourceQuery[TEntity](MergeOption mergeOption) 
    at System.Data.Objects.DataClasses.EntityCollection`1.CreateSourceQuery() 
    at Microsoft.Data.EFLazyLoading.LazyEntityCollection`1.CreateSourceQuery() 
    at Microsoft.Data.EFLazyLoading.LazyEntityCollection`1.LoadStubs() 
    at mptradModel.ContextObjects.ChansonWrapper.AttachEntities(Chanson chanson, ChansonRequest request) in (SolutionDir)\ProjectWrapper\ContextObjects\ChansonWrapper.cs:line 115 

什麼是真正的問題?我在創建命令期間嘗試將實體添加到另一個實體的列表時發生。

即:aCommand.Songs.Add(new Song() { Name = "SongName" });

謝謝給你們和對不起我的英語;我從魁北克來,通常說法語!

更新#1

我的行#115 chansonwrapper(其表示 「songwrapper」):

aCommand.Songs.Add(new Song() { Name = "SongName" });

更新#2

對不起,我試圖簡化代碼編寫,但我認爲它只是更令人困惑,所以這裏是我的真實代碼:

SongWrapper songWrapper = new SongWrapper(this.m_Context); 
Song song = songWrapper.Load(request.SongId); 
aCommand.Songs.Add(song); 

我的songWrapper的this.m_Context確保我的歌曲返回到我的「aCommand」或其他實體的相同上下文中,而我可以在之後加載/之前。這部分進行了測試,所以我們知道它的工作原理。有一件事情發生了變化,那就是我們轉移到了「LazyLoading」之前我們沒有使用過的東西。更奇怪的是,更新工作正常!幫助meee:oP!

+1

您顯示的線(myCommand.Songs.Add)真的是ChansonWrapper.cs:線115?你可以顯示所有的「ChansonWrapper.AttachEntities」並突出顯示第115行嗎? – 2009-12-01 22:00:49

+1

我認爲你正在使用延遲加載命中角落案例。如果您在執行'aCommand.songs.Add'之前查看'aCommand.songs.Count()'*,會發生什麼?我的理論:通常做「添加」會導致新的「歌曲」被附加。但是如果你在'歌曲'(懶惰)加載之前這樣做,那不會發生。 – 2009-12-02 13:37:12

+0

同樣,如果您在調用「添加」之前強制加載歌曲會發生什麼情況? 'aCommand.Songs.Load(); aCommand.Songs.Add(歌曲);' – 2009-12-02 18:09:29

回答

1

這當然不是EF 1.0。它必須是4.0 beta。我認爲這可能是一個懶加載的錯誤。你正在做(從你的問題的反向修改)if(aCommand.songs.Count() > 0。對於添加狀態的實體,這不應該試圖延遲加載歌曲。但它似乎試圖做到這一點。我唯一的建議是通過類似解決的bug:

if ((aCommand.EntityState != EntityState.Added) 
    && (aCommand.songs.Count() > 0)) 

...這是一個有點缺憾,或將延遲加載過這一點。如果您可以將其歸結爲可重複的測試用例,則可以將其報告給Microsoft Connect。

順便說一句,你通常應該喜歡:

if (aCommand.songs.Any()) 

...到Count() > 0,因爲它是更有效和可讀性。但這在這裏無關緊要。

+0

非常感謝。今天我們嘗試了更多的東西,並且修改了我們創建實體的方式,所以我們繞過了這個問題並且足夠清晰。但是,感謝「任何」,比你說的更清楚得多。 – 2009-12-03 21:09:10