创建期间的EF 1.0

时间:2009-12-01 21:50:17

标签: c# asp.net entity-framework

我使用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!

1 个答案:

答案 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,因为它更有效,更易读。但这与此无关。