SQL Server Profiler显示EF查询针对主数据库?

4

我在这里漏掉了什么?我在SQL Server Profiler中看到的查询都是针对主数据库的,这使得按数据库名称过滤变得困难...我应该观察哪个事件或事件,以便可以按数据库名称进行过滤。

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


你使用的SQL Server版本是什么?我记得在一些早期版本中,按数据库名称过滤的效果非常奇怪。 - Ladislav Mrnka
6个回答

6
你应该从EntityFramework连接中删除'MultipleActiveResultSets=True'。之后,您可以在Profiler中看到目标数据库名称,而不是master。
在我看来,ADO.NET团队可能想利用MultipleActiveResultSets功能从数据库获取数据,因此他们必须访问master。
MultipleActiveResultSets是关于发出一个查询并不返回其所有结果(例如在LINQ的foreach语句中) ,同时,在同一会话中发出另一个查询以获取另一个数据。
默认情况下,DB不允许此行为。所以...

请参考此线程http://stackoverflow.com/questions/2971781/why-does-sql-2008-profiler-indicate-that-stored-procedure-run-from-ef4-is-in-mas。 - Rui
1
如果您选择了SP:CacheHit事件,则数据库名称将显示出来。 - user5661968

5

我能够解决这个问题,包括保持 MARS 活动状态,方法是在连接字符串中添加应用程序名称:

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

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

2
正如K Ivanov所指出的,启用MARS(MultipleActiveResultSets)将在SQL Profiler中显示DatabaseName为master。将其设置为false,则将显示正确的DatabaseName,但这样一来就失去了具有MultipleActiveResults的能力。

2
如果这是针对 SQL Server 2008 R2 的话,在跟踪属性中的“事件选择”选项卡上,勾选“显示所有列”。然后您应该能够基于数据库名称创建列过滤器。
我认为您需要暂停或停止跟踪以进行这些更改。

1

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


这似乎有点“hackish”... 你有什么想法,为什么我不能只过滤数据库名称? - mattruma
你可以在任何列上进行过滤,那么DatabaseName有什么不同于其他列呢?只要你能够捕获到你正在执行的内容并过滤掉其余的流量,我就称之为解决方案。 - Kris Ivanov
1
顺便提一下,看看你的连接字符串中是否有MultipleActiveResultSets=True,将其设置为False可能会解决主数据库执行问题,这实际上是SQL Profile问题,而不是EF问题。 - Kris Ivanov

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接