无法将类型为“MvcMiniProfiler.Data.EFProfiledDbConnection”的对象转换为类型“System.Data.SqlClient.SqlConnection”

8

无法将类型为“MvcMiniProfiler.Data.EFProfiledDbConnection”的对象强制转换为类型“System.Data.SqlClient.SqlConnection”。

我正在尝试升级到MvcMiniProfiler 1.9.0,但每次调用MiniProfilerEF.Initialize()时都会出现这个问题。我已经删除了system.data配置部分,但我不知道我做错了什么。我已经按照网站上的步骤操作,但可能有些遗漏?

我正在使用EF code first 4.1,并将我的连接字符串名称传递给构造函数来创建我的数据上下文。

Web Activator

using Project.Web.App_Start;
using WebActivator;

[assembly: PreApplicationStartMethod(typeof(MiniProfiler), "Start")]

namespace Project.Web.App_Start {
    public class MiniProfiler {
        public static void Start()
        { 
            if (Eco.Environment.IsDevelopment) {
                MiniProfilerEF.Initialize();
            }
        }
    }
}

StructureMap注册表:

using Project.Domain.Repositories;
using StructureMap.Configuration.DSL;

namespace Project.Web.DependencyResolution.Registries {
public class RepositoriesRegistry : Registry {
    public RepositoriesRegistry() {
        For<IProjectDataContext>().HybridHttpOrThreadLocalScoped().Use(() => new ProjectDataContext(Eco.Database.Name));
          }
    }
}

DataContext构造函数:

    public ProjectDataContext(string nameOrConnectionString)
        : base(nameOrConnectionString) {
        Active = new Active(this);
    }

根据文档,我已经从配置文件中移除了system.data dataproviders, 因为只需要调用MiniProfilerEF.Initialize()即可。

**更新

之前在1.7版本的MvcMiniProfiler中,我需要设置Database.DefaultConnectionFactory属性,但我已将其移除。Database.DefaultConnectionFactory总是返回SqlConnectionFactory,难道不应该是ProfiledConnectionFactory或类似的东西吗?


您能提供代码和配置文件吗?通常情况下,您可以在与您的DBContext类同名的配置文件中定义连接字符串,并且您不需要使用非默认构造函数。 - Tejs
据我所知,NuGet 上有一个 EF 示例设置。但是:我能问一下吗:您是否总是使用经过配置的连接?或者您有时会使用配置文件连接(可能取决于用户),而有时会使用裸 SQL 连接? - Marc Gravell
@MarcGravell 我用的是1.7版本。我会从配置文件连接(Debug)切换到sql连接(Release),这样做很好用。 - Khalid Abuhakmeh
@Abuhakmeh,但我描述的情况并不相同,因为在单个AppDomain中始终如一。 - Marc Gravell
@MarcGravell 那么对你的问题的答案是,我始终使用在应用程序启动时确定的相同类型的连接。它只会在我重新启动应用程序时更改。在开发过程中,它总是被分析的。 - Khalid Abuhakmeh
如果你想让EF 4.1正常工作,你需要使用最新的版本,而不是NuGet。 - Sam Saffron
5个回答

2

我犯了一个错误,添加了 MiniProfiler.EF 而不是 MiniProfiler.EF6。移除 MiniProfiler.EF 并将其替换为 EF6 版本解决了我的问题。


谢谢你,Sam,这个救了我。 - Bassie

2

我曾经遇到过这个错误,让我非常困扰,但最终我找到了解决方法。我的问题与web.config、程序集、Initialize_42Initialize(false)等都没有关系。

以下是我的错误之处...

我启用了自动应用迁移,像这样:

App_Start:

Database.SetInitializer(
    new MigrateDatabaseToLatestVersion<DataContext, Migrations.Configuration>()
);

Migrations/Configuration.cs:

internal sealed class Configuration 
    : DbMigrationsConfiguration<Path.To.DataContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
    }
}

这是通过 WebActivator 触发的:

[assembly: WebActivator.PreApplicationStartMethod(
    typeof(service_tracker_mvc.App_Start.DatabaseInitializer), "Start")]

我无意中发现禁用这个进程可以使分析器正常工作。问题在于,这个初始化过程发生得太早了。通常它会在Application_Start期间发生(如果您没有使用这个高级的WebActivator),因此我将其更改为PostStart。现在它可以正常工作:

                        ▼▼▼▼
[assembly: WebActivator.PostApplicationStartMethod(
    typeof(service_tracker_mvc.App_Start.DatabaseInitializer), "Start")]

1

请查看 https://dev59.com/qGDVa4cB1Zd3GeqPe5da#10814033

这是在初始化 miniprofiler 之前进行 DB 操作所导致的问题,请在您的 db 上下文构造函数中设置断点,以及 MiniProfilerEF.Initialize(); 行上的另一个断点,并进行修订,直到初始化为首要任务。


0

我曾经遇到过同样的问题,解决方法是转向使用Glimpse:http://getglimpse.com/。在我看来,它比miniprofiler更好用、更易于使用、更完整等等。


0
我看到的问题是,ProjectDataContext将一些数据上下文封装到属性“Active”中,但MvcProfiler代理找不到它。
此外,EFProfiledDbConnection实际上是DbConnection的子类,而不是SqlConnection的子类。它是以抽象的方式构建的,用于使用不同的Db提供程序,如MySql、Postgres等。请仔细检查代码中的所有变量,它们应该是DbConnection,而不是SqlConnection(这是MsSql的提供程序)。

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