【发布时间】:2009-12-01 21:50:16
【问题描述】:
我在使用 EF1.0 时遇到了一个奇怪的问题……我的问题只发生在创建过程中,我在许多论坛的帖子上都没有找到任何东西。
> System.InvalidOperationException:当相关对象处于添加状态或分离状态并且最初未使用 NoTracking 合并选项检索时,无法返回此 EntityCollection 或 EntityReference 的源查询。 在 System.Data.Objects.DataClasses.RelatedEnd.CreateSourceQuery[TEntity](MergeOption mergeOption) 在 System.Data.Objects.DataClasses.EntityCollection`1.CreateSourceQuery() 在 Microsoft.Data.EFLazyLoading.LazyEntityCollection`1.CreateSourceQuery() 在 Microsoft.Data.EFLazyLoading.LazyEntityCollection`1.LoadStubs() 在 (SolutionDir)\ProjectWrapper\ContextObjects\ChansonWrapper.cs:line 115 中的 mptradModel.ContextObjects.ChansonWrapper.AttachEntities(Chanson chanson, ChansonRequest request)真正的问题是什么?我在创建命令期间尝试将实体添加到另一个实体的列表时发生这种情况。
即:aCommand.Songs.Add(new Song() { Name = "SongName" });
谢谢你们,对不起我的英语;我来自魁北克,平时说法语!
更新 #1
我在 chansonwrapper 中的第 115 行(意思是“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”我们以前不使用的东西。更奇怪的是,更新工作正常!帮帮我:oP!
【问题讨论】:
-
您显示的行 (myCommand.Songs.Add) 真的是 ChansonWrapper.cs:line 115 吗?你能显示所有的
ChansonWrapper.AttachEntities并突出显示第 115 行吗? -
我认为你遇到了延迟加载的问题。如果您尝试查看
aCommand.songs.Count()之前 执行aCommand.songs.Add会发生什么?我的理论:做Add通常会导致新的Song成为附加。但是如果你在songs被(懒惰地)加载之前这样做,那就不会发生。 -
再一次,如果您在调用
Add之前强制加载歌曲会发生什么?aCommand.Songs.Load(); aCommand.Songs.Add(song); -
现有歌曲。我们可以加载它。 aCommand.Songs 仅在创建时无法访问(由于错误显示为上)。更新时,相同的方法可以正常工作。这就像当我们执行命令 aCommand = new Command() 时集合没有正确添加到上下文中,我们尝试通过这种方式添加歌曲。我们尝试创建它,然后添加歌曲并最终更新它并且它可以工作......
标签: c# asp.net entity-framework