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

时间:2011-12-29 15:15:53

标签: c# sql entity-framework mvc-mini-profiler

无法转换类型' MvcMiniProfiler.Data.EFProfiledDbConnection'输入' System.Data.SqlClient.SqlConnection'。

我正在尝试升级到MvcMiniProfiler 1.9.0,当我调用MiniProfilerEF.Initialize()时我会继续这样做。我已经删除了system.data配置部分。我不知道自己做错了什么。我已经按照网站上的步骤进行了操作,但也许我错过了什么?

我首先使用EF代码4.1并且我将我的connectionstring的名称传递给构造函数以创建我的datacontext。

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或类似的东西吗?

5 个答案:

答案 0 :(得分:2)

我看到了同样的错误。它让我疯了但我终于明白了。我的问题与web.config,集会,Initialize_42Initialize(false)黑客或任何事情无关。

这是我出错的地方......

我已启用自动应用此类迁移:

App_Start:

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

迁移/ 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 :(得分:2)

我错误地添加了MiniProfiler.EF而不是MiniProfiler.EF6。删除MiniProfiler.EF并将其替换为EF6版本修复了我的问题。

答案 2 :(得分:1)

请参阅https://stackoverflow.com/a/10814033/311289

这是因为在初始化miniprofiler之前执行数据库操作,在数据库上下文的contstructor中放置一个断点,在MiniProfilerEF.Initialize();行上放置另一个断点,然后修改直到初始化为止。

答案 3 :(得分:0)

我在这里看到的问题是,ProjectDataContext将一些数据上下文封装到属性“Active”中,而MvcProfiler代理无法找到它。

不仅如此,EFProfiledDbConnection实际上是DbConnection的子级,而不是SqlConnection的子级。它是在抽象方面使用不同的Db提供者,如MySql,Postgres等。请尝试检查代码中的所有变量,它们应该是DbConnection,但不是SqlConnection(这是MsSql的提供者)。

答案 4 :(得分:0)

我遇到了同样的问题,我发现修复它的方法是转移到Glimpse:http://getglimpse.com/。在我看来,它比miniprofiler好多了,易于使用,完整等等。