Невозможно привести объект типа «MvcMiniProfiler.Data.EFProfiledDbConnection» к типу «System.Data.SqlClient.SqlConnection». - PullRequest
7 голосов
/ 29 декабря 2011

Невозможно привести объект типа 'MvcMiniProfiler.Data.EFProfiledDbConnection' к типу 'System.Data.SqlClient.SqlConnection'.

Я пытаюсь выполнить обновление до MvcMiniProfiler 1.9.0и я продолжаю получать это, когда я вызываю MiniProfilerEF.Initialize ().Я удалил раздел конфигурации system.data.Я не знаю, что я делаю не так.Я выполнил шаги на сайте, но, может быть, что-то пропустил?

Сначала я использую код EF 4.1 и передаю имя моей строки соединения в конструктор для создания своего текстового контекста.

Веб-активатор

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 из моей конфигурации, начиная с документацииговорит, что мне нужно только вызвать MiniProfilerEF.Initialize ().

** Обновление

Ранее в 1.7 MvcMiniProfiler мне нужно было установить свойство Database.DefaultConnectionFactory, но я его убрал.Database.DefaultConnectionFactory всегда возвращается как SqlConnectionFactory, разве это не ProfiledConnectionFactory или что-то в этом роде?

Ответы [ 5 ]

2 голосов
/ 12 января 2017

Я сделал ошибку, добавив MiniProfiler.EF вместо MiniProfiler.EF6. Удаление MiniProfiler.EF и его замена версией EF6 устранили мою проблему.

2 голосов
/ 05 апреля 2012

Я видел эту же ошибку. Это сводило меня с ума, но я наконец понял это. Моя проблема не имела ничего общего с web.config, сборками, Initialize_42 или Initialize(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 голос
/ 30 апреля 2014

см. https://stackoverflow.com/a/10814033/311289

Это вызвано выполнением операций с БД перед инициализацией минипрофиля, установкой точки останова в contstructor для контекста db, а другой - в строке MiniProfilerEF.Initialize(); и изменением до первой инициализации.

0 голосов
/ 09 января 2014

У меня была такая же проблема, и я нашел способ ее исправить - перейти на Glimpse: http://getglimpse.com/. На мой взгляд, это намного лучше, чем минипрофилер, простой в использовании, полный и т.д.*

0 голосов
/ 01 марта 2012

Проблема, которую я вижу здесь, заключается в том, что ProjectDataContext инкапсулирует некоторый контекст данных в свойство «Active», которое не может быть найдено прокси-сервером MvcProfiler.

Более того, EFProfiledDbConnection на самом деле является дочерним элементом DbConnection, но не SqlConnection.ребенок.Это сделано с точки зрения абстракции для использования различных провайдеров Db, таких как MySql, Postgres и т. Д. Пожалуйста, попробуйте просмотреть все переменные в коде, они должны быть DbConnection, но не SqlConnection (это провайдер MsSql).

...