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

Невозможно привести объект типа 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));
          }
    }
}

Конструктор контекста данных:

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

Я удалил поставщики данных system.data из моей конфигурации, поскольку в документации сказано, что мне нужно только вызвать MiniProfilerEF.Initialize().

**Обновлять

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


person Khalid Abuhakmeh    schedule 29.12.2011    source источник
comment
Можете ли вы предоставить код + файл конфигурации? Как правило, вы определяете строку подключения в файле конфигурации с тем же именем, что и у вашего класса DBContext, и вам никогда не нужно использовать конструктор не по умолчанию.   -  person Tejs    schedule 29.12.2011
comment
Iirc есть пример установки EF на nuget. Но: могу я спросить: вы всегда даете ему профилированное соединение? Или вы иногда (возможно, в зависимости от пользователя) используете соединение профилей, а иногда используете открытое соединение SQL?   -  person Marc Gravell    schedule 29.12.2011
comment
@MarcGravell Я сделал это с версией 1.7. Я бы переключился с профилированного соединения (отладка) на соединение sql в (релиз). Это работало нормально.   -  person Khalid Abuhakmeh    schedule 29.12.2011
comment
@Abuhakmeh, это не то же самое, что я описывал, поскольку это всегда одно и то же в одном AppDomain.   -  person Marc Gravell    schedule 29.12.2011
comment
@MarcGravell Тогда ответ на ваш вопрос заключается в том, что я всегда использую один и тот же тип соединения, определенный при запуске приложения. Он меняется только при перезапуске приложения. При разработке он всегда профилируется.   -  person Khalid Abuhakmeh    schedule 29.12.2011
comment
если вы хотите, чтобы EF 4.1 работал, вам понадобится использовать последнюю версию.. не nuget   -  person Sam Saffron    schedule 04.01.2012


Ответы (5)


Я видел эту же ошибку. Это сводило меня с ума, но я, наконец, понял это. Моя проблема не имела ничего общего с web.config, сборками, Initialize_42 или Initialize(false) хаками или чем-то еще.

Вот где я ошибся...

Я включил автоматическое применение миграции следующим образом:

Приложение_Начало:

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")]
person Michael Haren    schedule 05.04.2012

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

person Sam    schedule 12.01.2017
comment
Спасибо, Сэм, это спасло меня. - person Bassie; 08.10.2017

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

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

person Ryan Davis    schedule 30.04.2014

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

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

person Oleksii G.    schedule 01.03.2012

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

person rafael oliveira    schedule 09.01.2014