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

这是两个类的代码。


Dish
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。我相信我在这里缺少一些细微之处。任何帮助表示赞赏。

调试信息:

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

如果我从视图中删除行@dish.DishImages.First().ImagePath,尽管没有任何图像,它也可以正常工作。

最佳答案

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

...当“代码优先”通过以下方式创建连接时
在我们的示例中一直存在的约定,它将启用MARS。如果您正在供应
您自己的连接,如果需要,则需要确保已启用MARS
能够有多个活动查询。

如果您未启用MARS,并且您的代码尝试运行两个活动查询,则会收到
一个例外。您收到的异常将取决于触发
第二个查询,但内部异常将是一个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()等),这不是问题。

因此,您可以将集合传递给视图。第一个查询在您的foreach循环中执行-确定,仍然没有问题...

直到我们到达img标记:<img src="@dish.DishImages.First().ImagePath" />。此(@dish.DishImages.First())对db->问题执行新查询!

解:

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

10-07 15:21