【问题标题】:SQL Server Profiler showing EF queries against master database?SQL Server Profiler 显示针对主数据库的 EF 查询?
【发布时间】:2011-03-22 21:09:16
【问题描述】:

我在这里缺少什么?我在 SQL Server Profiler 中看到的查询都是针对 master 数据库的,这使得按数据库名称过滤变得很困难......我应该关注哪些事件或事件,以便我可以按数据库名称过滤。

更大的问题,这里到底发生了什么?

【问题讨论】:

  • 您使用的是什么版本的 SQL Server?我记得在以前的一些版本中,按数据库名称过滤的工作非常奇怪。

标签: sql-server entity-framework sql-server-profiler


【解决方案1】:

您应该从您的 EntityFramework 连接中删除此“MultipleActiveResultSets=True”

字符串

之后,您可以在 Profiler 中看到目标数据库名称,而不是 master。

在我的选择中,也许 ADO.NET 团队想要使用 MultipleActiveResultSets 功能来获取

来自 DB 的数据,因此他们必须访问 master。

MultipleActiveResultSets 是关于引发一个查询而不返回其所有结果(如在 LINQ 中的 foreach 语句中),同时引发另一个查询以在同一会话中获取另一个数据。

默认情况下,DB 不允许这种行为。所以.....

【讨论】:

【解决方案2】:

我能够解决这个问题,包括通过在我的连接字符串中添加应用程序名称来保持 MARS 处于活动状态:

Data Source=database_server;Initial Catalog=MyDatabase;Trusted Connection=true;MultipleActiveResultSets=True;Application Name=MyDatabase;

然后您可以过滤应用程序名称。

【讨论】:

    【解决方案3】:

    如果这是针对 SQL Server 2008 R2,请在跟踪属性中的“事件选择”选项卡上,选中“显示所有列”。然后,您应该能够根据 DatabaseName 创建列过滤器。

    我相信您必须暂停或停止跟踪才能进行这些更改。

    【讨论】:

      【解决方案4】:

      正如 K Ivanov 所指出的,启用 MARS(MultipleActiveResultSets)将在 SQL Profiler 中将 DatabaseName 显示为 master。通过将此设置为 false,它将显示正确的 DatabaseName,但随后您将失去拥有 MultipleActiveResults 的能力。

      【讨论】:

        【解决方案5】:

        您可以使用LoginName 或HostName 在分析器中进行过滤

        【讨论】:

        • 这似乎有点“骇人听闻”......知道为什么我不能只过滤数据库名称吗?
        • 您可以过滤任何列,DatabaseName 与其他列有何不同?只要您能够捕获您正在执行的内容并过滤掉其余的流量,我称之为解决方案
        • 顺便说一句,看看你的连接字符串中是否有 MultipleActiveResultSets=True,将其设置为 False 可能会解决主数据库执行的问题,这实际上是 SQL Profile 问题而不是 EF 问题
        【解决方案6】:

        由于某种原因,如果我选择 SP:CacheHit 事件,它现在会显示针对正确数据库的查询,并且我可以通过它进行过滤。那个事件到底是什么?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多