gpt4 book ai didi

asp.net - 在 Azure SQL 上打开 DataReader 错误,但在 SQL Server 2014 上却没有

转载 作者:行者123 更新时间:2023-12-03 00:14:26 24 4
gpt4 key购买 nike

我找到了一些关于此的帖子,但似乎找不到与我的代码相关的帖子。

以下行突出显示错误:

Line 74:         <td>
Line 75: @Html.DisplayFor(modelItem => item.Equipment.ModelName)
Line 76: </td>

呈现数据的 View 部分如下所示:

@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Location)
</td>
<td>
@Html.DisplayFor(modelItem => item.Position)
</td>
<td>
@Html.DisplayFor(modelItem => item.Description)
</td>
<td>
@Html.DisplayFor(modelItem => item.SerialNo)
</td>
<td>
@Html.DisplayFor(modelItem => item.InstallDate)
</td>
<td>
@Html.DisplayFor(modelItem => item.ServiceFrequency) Months
</td>
<td>
@Html.DisplayFor(modelItem => item.NextServiceDate)
</td>
<td>
@Html.DisplayFor(modelItem => item.Equipment.ModelName)
</td>
<td>
@Html.DisplayFor(modelItem => item.Owner.OwnerName)
</td>
<td>
@Html.DisplayFor(modelItem => item.ServiceCompany.CompanyName)
</td>
<td>
@Html.DisplayFor(modelItem => item.Site.SiteName)
</td>

<td>
@Html.ActionLink("Edit", "Edit", new { id=item.AssetID })
@Html.ActionLink("Details", "Details", new { id=item.AssetID })
@Html.ActionLink("Delete", "Delete", new { id=item.AssetID })
</td>
</tr>

Controller 看起来像这样:

public ActionResult Index()
{
var userId = User.Identity.GetUserId();
var asset = from a in db.Assets
join o in db.Owners on a.OwnerID equals o.OwnerID into oa
from asst in oa.DefaultIfEmpty()
join s in db.ServiceCompanies on a.ServiceCompanyID equals s.ServiceCompanyID into sa
from service in sa.DefaultIfEmpty()
where asst.RegUserID == userId || service.RegUserID == userId
select a;

return View(asset);
}

据我所知,我已尝试连接到数据库两次,但我看不到在哪里,而且我的笔记本电脑上也没有收到此错误。我觉得这可能是 Azure SQL 数据库中不可用的东西,但在 SQL Server 2014 中却可以。

有什么想法吗?

更新::::

我已通过将 MultipleActiveResultSets=true 添加到连接字符串来阻止该问题,但我不确定这是否掩盖了需要解决的问题或可能引入其他问题。

最佳答案

添加MultipleActiveResultSets=true就可以了。

我总是默认将其设置为 true - 它通常更安全,特别是如果您使用任何第三方库。

但是,在这种特殊情况下导致这种情况的原因是您的代码中存在 SELECT N+1 问题(您返回到 SQL 来获取每条记录以检索另一位数据) )。

例如,您渲染 item.Equipment.ModelName ,这会导致到服务器的另一次往返来获取该值(假设它们是虚拟属性)。因此,您已经有一个打开的连接,因此您可以迭代结果集,并且需要在同一连接上运行另一个查询来获取 Equipment 实体。当您迭代结果集时,任何 ORM 和虚拟属性都很容易发生这种情况。通常,您可以通过告诉 ORM 预取您需要的属性来解决这个问题,或者更好的是,通过在查询中进行投影,以便 SQL 为您提供您需要的所有数据,仅此而已。更好的性能。在您的情况下,不要选择,而是执行类似

的操作
select new {
a.Location,
a.Position
....
EquipmentName = a.Equipment.ModelName
....
}

现在,您可以将其作为动态传递给您的 View (我认为 - 不确定),但您可能想要创建一个具有相关属性的具体类(R# 会这样做为您)以便更轻松地将其发送到 View 。

检测此问题的最简单方法是在 SQL Server 本地实例上使用 SQL Server Profiler 来准确查看哪些查询发送到 SQL Server。

关于asp.net - 在 Azure SQL 上打开 DataReader 错误,但在 SQL Server 2014 上却没有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30963283/

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