C# 创建过程中的EF 1.0

C# 创建过程中的EF 1.0,c#,asp.net,entity-framework,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

我在使用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
songWrapper的this.m_上下文确保我的歌曲返回到与我的“aCommand”或其他实体相同的上下文中,我可以稍后/之前加载这些实体。这部分已经过测试,所以我们知道它是有效的。有一件事已经改变了,那就是我们开始“懒散地加载”以前没有用过的东西。更奇怪的是,更新工作正常!救命米:啊

这肯定不是EF 1.0。它必须是4.0测试版。我认为这可能是延迟加载中的一个错误。您正在(从问题的后修订版)执行
if(aCommand.songs.Count()>0
。对于处于添加状态的实体,这不应该尝试惰性地加载歌曲。但它似乎正在尝试这样做。我唯一的建议是通过以下方式解决此错误:

if ((aCommand.EntityState != EntityState.Added) 
    && (aCommand.songs.Count() > 0))
…这有点麻烦,或者为此关闭延迟加载。如果您可以将其归结为可复制的测试用例,您可能会将其报告给Microsoft Connect

顺便说一下,您通常应该更喜欢:

if (aCommand.songs.Any()) 

…到
Count()>0
,因为它更高效、更可读。但这与此处无关。

是您显示的行(myCommand.Songs.Add)真的吗ChansonWrapper.cs:第115行?你能显示所有的
ChansonWrapper.Attachenties
并突出显示第115行吗?我认为你的延迟加载遇到了问题。如果你尝试查看
aCommand.songs.Count()
在执行
命令.歌曲.添加之前添加
?我的理论是:执行
添加
通常会导致新的
歌曲
被附加。但是如果在
歌曲
被(惰性地)加载之前执行此操作,则不会发生这种情况。同样,如果在调用
添加
之前强制加载歌曲会发生什么情况?
命令.歌曲.加载();aCommand.Songs.Add(song);
现有歌曲。我们可以加载它。aCommand.Songs只有在创建时才能加载(由于上面显示的错误)。更新时,相同的方法可以正常工作。这就像在执行命令aCommand=new Command()时,没有正确地将集合添加到上下文中一样我们尝试通过这种方式添加一首歌曲。我们尝试过创建它,然后添加歌曲,最后更新它,它工作了…谢谢。今天我们尝试了更多的事情,修改了我们创建实体的方式,所以我们绕过了这个问题,并且已经足够清楚了。但是谢谢你说的“任何”比“计算”清楚得多。
if (aCommand.songs.Any())