gpt4 book ai didi

linq - "There is already an open datareader associated with this command"- 即使使用 Include()

转载 作者:行者123 更新时间:2023-12-04 05:56:46 25 4
gpt4 key购买 nike

我正在尝试加载所有 Dish 对象。 DishDishImage 具有一对多的关系,即一个 Dish 可以有多个 DishImage

这是两个类的代码。

  1. Dish
  2. DishImage

这就是我尝试在操作方法中检索它的方式:

    [ChildActionOnly]
public PartialViewResult TopDishes()
{
IEnumerable<Dish> topDishes = dishRepository.Dishes.Include( d => d.DishImages );
return PartialView(topDishes);
}

查看代码如下:

  @model IEnumerable<RestaurantHub.Domain.Entities.Dish>

@foreach (var dish in Model)
{
<div class="top-ten-offers-list">

<div class="top-ten-offer">
<p class="top-ten-deal-description">
@dish.Description
</p>

<img src="@dish.DishImages.First().ImagePath" />
<p class="top-ten-deal-title">@dish.Name</p>
</div>

</div>
}

我已经阅读了几个 SO 问题,其中大多数建议使用 Include()(我正在这样做),其他人建议将 MARS 设置为 true。我相信我在这里遗漏了一些微妙的观点。感谢您的帮助。

调试信息:

如果我将代码调试到操作方法,我可以验证(通过枚举结果)是否正在加载正确的数据。但是当控件到达 View 中的 foreach 循环时,它会抛出上述错误。

如果我从 View 中删除行 @dish.DishImages.First().ImagePath 它工作正常,但我没有得到任何图像。

Debug view of Result Set

最佳答案

那是因为你同时有多个查询:

... 当 Code First 通过以下方式创建连接时按照我们的示例中的惯例,它将启用 MARS。如果你供应你自己的连接,如果你想成为能够有多个事件查询。

如果您不启用 MARS 而您的代码尝试运行两个事件查询,您将收到一个异常(exception)。您收到的异常将取决于触发第二个查询,但内部异常将是一个 InvalidOperationException 声明“已经有一个与此命令关联的打开的 DataReader,必须是先关门。” - from Julia Lerman's Programming EF DbContext

您似乎已经在 web.config 中为 EF 创建了自己的连接。如果是这样,您应该添加 MultipleActiveResultSets=True;到它的connectionString属性:

<add name="..." connectionString="metadata=res:...;provider=System.Data.SqlClient;provider connection string=&quot;data source=... ;
MultipleActiveResultSets=True; //Add this
App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

更新:

其实问题是从你的角度来看的。 <img src="@dish.DishImages.First().ImagePath" />行导致该异常。你问为什么?!我会告诉你原因:

首先,您对数据库执行了查询:

IEnumerable<Dish> topDishes = dishRepository.Dishes.Include( d => d.DishImages );                                                        
return PartialView(topDishes);

然而,实际上你并没有执行任何查询!您刚刚创建了一个 IEnumerable 集合(那是因为您没有调用 .ToList().AsEnumerable() 等),这不是问题。

所以你将一个集合传递给你的 View 。第一个查询在您的 foreach 中执行loop - 好的,还是没问题...

直到我们到达 img标签:<img src="@dish.DishImages.First().ImagePath" /> .这 ( @dish.DishImages.First() ) 对数据库执行新查询 --> 问题所在!

解决方案:

我不知道调用 .ToList()在你的 Controller 中解决你的问题与否 - 也许吧。但是,您当前的 EF 连接字符串必须具有 MultipleActiveResultSets=True;属性在这些情况下正常工作。

关于linq - "There is already an open datareader associated with this command"- 即使使用 Include(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18052017/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com