List.Foreach在Using块中使用一次性项目

3

很抱歉,我搜索了一下但无法找到我的问题的答案。如果这是一个重复的问题,请引导我至正确的解决方案。

我有一个Entity Framework Core的设置,它跟踪一个名为“TestRun”的对象。我创建了一个TestRuns列表,并希望将它们添加到DbContext中,然后将它们写入数据库。使用常规的ForEach循环可以正常工作,但是当我尝试在using块内使用List.Foreach时,Visual Studio会提示该一次性对象已被释放。“访问已释放的闭包”。

using (var context = new TestResultsContext())
{
    _testRuns.ForEach(t => context.Add(t));
    context.SaveChanges();
}

我认为这与“懒加载”有关,但ForEach是一个空的返回值,因此无法强制结果枚举。

1
我对“访问已释放的闭包”问题没有答案,但是有一个DbContext.AddRange方法可以让您在一行中添加实体集合。尝试一下。 - Moho
当您说它可以与常规的foreach一起使用时,您是否也在using中编写它?此外,ForEach不是LINQ。它是常规的List<T>类方法,因此它不是惰性的。 - GrayCat
1个回答

3
List<T>.ForEach不是LINQ方法,它来自List<T>类,也不是惰性评估的。所以关于Visual Studio的警告,不一定需要考虑所有警告,这就是其中之一。分析器并不完美。
然而,您不需要使用这些方法,因为正确的方法是使用 DbSet<T> AddRange 方法:
using (var context = new TestResultsContext())
{
    context.TestRuns.AddRange(_testRuns);
    context.SaveChanges();
}

我也相信这个关于已处理闭包的警告可能不是误导性的,但要确定这一点,需要提供更多细节和代码的广泛视角。 - GrayCat
@GrayCat 可能分析器无法确定该方法是立即评估还是上下文保留在内存中。 - Camilo Terevinto
@Camilo Treventinto - 你可能是对的。但仍然困扰着我可能是原因。 - GrayCat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接