我使用EF1.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
真正的问题是什么?当我在创建命令期间尝试将实体添加到另一个实体的列表时,我发生了这种情况。
I.E。:aCommand.Songs.Add(new Song() { Name = "SongName" });
谢谢你们,对不起我的英语;我来自魁北克,通常会说法语!
更新#1
我在chansonwrapper的第115行(意思是“歌曲包装”):
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”。更奇怪的是,更新工作正常!帮助我:oP!
答案 0 :(得分:1)
这肯定不是EF 1.0。它必须是4.0 beta。我认为这可能是延迟加载的一个错误。你正在做(从你的问题的后面修订版)if( aCommand.songs.Count() > 0
。对于处于添加状态的实体,这不应该试图懒洋洋地加载歌曲。但它似乎正试图这样做。我唯一的建议是通过以下方式解决这个问题:
if ((aCommand.EntityState != EntityState.Added)
&& (aCommand.songs.Count() > 0))
...这有点kludgy,或为此变成懒惰装载。如果您可以将其归结为可重现的测试用例,则可以将其报告给Microsoft Connect。
顺便说一下,您通常应该更喜欢:
if (aCommand.songs.Any())
... Count() > 0
,因为它更有效,更易读。但这与此无关。