【问题标题】:Entity Framework 4.1 Performance issues实体框架 4.1 性能问题
【发布时间】:2011-12-14 09:18:45
【问题描述】:

我目前在 ASP.NET MVC 3 项目中使用实体框架。 在循环浏览视图中的记录以显示它们时,我遇到了严重的性能问题。

数据正在快速接收,所以我知道这不是与我们的远程 oracle 服务器的连接,并且我正在使用的模型中没有延迟加载的关系,但每条记录需要 120-300 毫秒来处理一个简单的 3带有操作链接的字段输出。

目前加载包含 800 条记录的页面需要 3 多分钟。

我尝试使用配置选项进行调整,但似乎没有任何帮助。

有人有什么想法吗?

编辑:控制器代码

readonly OracleSampleManagerContext db = new OracleSampleManagerContext();

public virtual ActionResult Index()
{
        var spList = db.SamplePoints.OrderBy(e=>e.Id).ToList(); 
        return View(MVC.Reports.Views.SamplePointList, spList);
}

    <h2>
    Selection By Sample Point
</h2>

<table>
@foreach (var sp in Model)
{
        System.Diagnostics.Stopwatch sw = new  System.Diagnostics.Stopwatch();
        sw.Start();

    <tr>
        <td>@Html.ActionLink(sp.Id, MVC.Reports.Results(sp.Id))</td>
        <td>@sp.Description</td>
        <td>@sp.PointLocation</td>
        <td>@sw.ElapsedMilliseconds</td>
    </tr>

    sw.Stop();
    sw.Reset();
}

</table>

例子:

0200    72" Sewer to river - Once through cooling water     OUTFALLS    346ms
0400    66" Sewer to river - Combined effluent  OUTFALLS    347ms
0500    54" Sewer to river - Once through cooling water     OUTFALLS    388ms
06-AI-18    TBA in Water    IB2     228ms
06-AI-31    TBA in Water    IB2     172ms

【问题讨论】:

  • 您将不得不向我们展示更多。你如何填充模型? MVC.Reports.Results() 在做什么?
  • 在创建Model 时,查询是否真的在执行?比如你当时在做ToList()吗?
  • 这是一个小小的挑剔,但你应该将秒表的声明行移到循环之外
  • 如果禁用或减小页面大小,您无论如何都应该启用分页,每页 800 条记录太多了。这并不是说你的优化不好,但是在你优化了慢的东西之后,每页显示的记录也更少;-)
  • @Html.ActionLink(sp.Id, MVC.Reports.Results(sp.Id))?在视图中获取数据?性能问题是这段代码最少的问题。视图用于显示数据,而不是用于获取。还是我弄错了,那是 T4 模板?

标签: c# asp.net-mvc-3 entity-framework entity-framework-4.1 ef-code-first


【解决方案1】:

我的猜测是MVC.Reports.Results(sp.Id) 会进行某种数据库查找,并且由于您在将模型发送到视图之前将其转换为列表,因此您现在必须为每条记录再次访问数据库 制作一个包含 800 条记录的页面需要 801 次单独访问数据库而不是一次。

  1. 从您的第一个查询中删除 ToList()。
  2. 重构 MVC.Reports.Results(sp.Id) 以获取对象而不是 int,并在该方法中直接处理对象。

以上两种情况都可能需要您将实体上下文的范围从操作内移到控制器。

【讨论】:

  • 在你做所有这些之前,你可以在调用 actionlink 之前将计时器输出移动到
  • 定时器正在被移除,它只是暂时放在那里以找到性能问题的根本原因
  • 上下文目前对控制器来说是全局的,但我会尝试你的其他建议并回复你
  • 原来 2/3 的问题是由于我们的 vpn 服务器上的网络问题,因为我正在家里进行测试,但这篇文章确实有部分帮助,所以我给你代表答案 =)跨度>
猜你喜欢
  • 2011-11-16
  • 2011-08-01
  • 2016-03-09
  • 1970-01-01
  • 2018-08-02
相关资源
最近更新 更多