【问题标题】:EF 1.0 during creation创建期间的 EF 1.0
【发布时间】: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


【解决方案1】:

这肯定不是 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,因为它更高效、更易读。但这在这里无关紧要。

【讨论】:

  • 谢谢。今天我们尝试了更多的东西,我们修改了我们创建实体的方式,所以我们绕过了这个问题并且它足够清晰。但是感谢“任何”,这比你说的计数要清楚得多。
猜你喜欢
  • 1970-01-01
  • 2017-03-28
  • 2021-02-23
  • 1970-01-01
  • 2023-03-26
  • 2021-08-09
  • 1970-01-01
  • 2017-08-24
  • 1970-01-01
相关资源
最近更新 更多