我正在尝试加载所有Dish
对象。 Dish
和DishImage
具有一对多关系,即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="data source=... ;
MultipleActiveResultSets=True; //Add this
App=EntityFramework"" 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;
属性,才能在这些情况下正常工作。