EF 4.1 Code-First 项目上的 MvcMiniProfiler 不分析 SQL

Posted

技术标签:

【中文标题】EF 4.1 Code-First 项目上的 MvcMiniProfiler 不分析 SQL【英文标题】:MvcMiniProfiler on EF 4.1 Code-First project doesn't profile SQL 【发布时间】:2011-07-20 06:05:40 【问题描述】:

我引用了 MvcMiniProfiler 的 1.6 版(通过 Nuget),并按照项目主页http://code.google.com/p/mvc-mini-profiler/ 中的描述设置了所有内容。

我在 Web.config 中有以下代码:

<system.data>
    <DbProviderFactories>
        <remove invariant="MvcMiniProfiler.Data.ProfiledDbProvider" />
        <add name="MvcMiniProfiler.Data.ProfiledDbProvider" invariant="MvcMiniProfiler.Data.ProfiledDbProvider" description="MvcMiniProfiler.Data.ProfiledDbProvider" type="MvcMiniProfiler.Data.ProfiledDbProviderFactory, MvcMiniProfiler, Version=1.6.0.0, Culture=neutral, PublicKeyToken=b44f9351044011a3" />
    </DbProviderFactories>
</system.data>

(项目主页的 Version=1.5.0.0 - NuGet 包已经更新)

我在 Global.asax 中有以下代码(并且连接字符串也在 Web.config 中定义):

    protected void Application_Start()
    
        Log.Info("ReCoupon has started.");

        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);

        var factory = new SqlConnectionFactory(ConfigurationManager.ConnectionStrings["ReCouponContext"].ConnectionString);
        var profiled = new MvcMiniProfiler.Data.ProfiledDbConnectionFactory(factory);
        Database.DefaultConnectionFactory = profiled;

        Database.SetInitializer(new ReCouponContextInitializer());
    

探查器工作得很好,只是我无法用它来探查 SQL。我正在使用 SQL Server 2008 Express。我一直在关注 Google Code 项目主页上的相关问题,完全被卡住了。

【问题讨论】:

嘿@Sam Saffron,下面的解决方案有效 - 我不太明白。我可以让您访问我的 bitbucket 存储库,以便您可以在需要时查看它的运行情况。 试一试 1.9.1。更新后,我终于有了 EF 的 SQL 分析。 【参考方案1】:

这个也让我难过很久。似乎连接字符串命名约定优先于 Database.DefaultConnectionFactory。

您可以尝试重命名 web.config 中的连接字符串吗?

来自

   <connectionStrings>
       <add name="ReCouponContext" connectionString="..." />
   </connectionStrings>

   <connectionStrings>
       <add name="ReCoupon" connectionString="..." />
   </connectionStrings>

然后改变

var factory = new SqlConnectionFactory(ConfigurationManager.ConnectionStrings["ReCouponContext"].ConnectionString);

var factory = new SqlConnectionFactory(ConfigurationManager.ConnectionStrings["ReCoupon"].ConnectionString);

【讨论】:

天啊——它就像一个魅力。我不确定我理解您所说的命名约定优先是什么意思? EF 代码首先会自动查找与您的上下文类同名的连接字符串。如果找不到,它将查看 Database.DefaultConnectionFactory。不过,如果我们想要分析多个数据库,我不确定我们应该做什么。 这似乎对我不起作用。当我将 MyModelContext 连接字符串重命名为 MyModel 时,登录失败。这是因为 DefaultConnectionFactory 将设置服务器、用户名和密码,但它不会设置数据库名称,因此 EF 正在寻找一个名为 MyProject.MyModel.MyModelContext 的数据库,因为我称我的数据库不同,所以它显然不存在。似乎将 EF 代码首先指向不同数据库的唯一方法是使用一个名为 MyModelContext 的连接字符串,这显然不适用于 MVCProfiler。有什么想法吗? 我现在能想到的最好的方法是Changing the Database Name。如果有人能提供更好的方法,我会很感兴趣。 这根本不适合我。我在命名优先级方面遇到了同样的问题,但即使在更改它之后,它也根本没有显示任何 SQl 分析信息

以上是关于EF 4.1 Code-First 项目上的 MvcMiniProfiler 不分析 SQL的主要内容,如果未能解决你的问题,请参考以下文章

在使用 EF 4.1 Code-First 的 Include 和/或 Select 方法时订购导航属性?

如何将时态表添加到 EF Code-First DBContext?

EF Code-First 学习之旅

20.1翻译系列:EF 6中自动数据迁移技术EF 6 Code-First系列

20.翻译系列:Code-First中的数据库迁移技术EF 6 Code-First系列

15.翻译系列:EF 6中的级联删除EF 6 Code-First 系列