2011-12-29 3 views
7

Невозможно привести объект типа «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, и я передаю имя моей строки соединения в конструктор для создания моего 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 Constructor:

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

Я удалил System.Data dataproviders Фрон моей конфигурации, так как документация говорит, что нужно только для вызова MiniProfilerEF.Initialize().

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

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

+0

Можете ли вы предоставить код + конфигурационный файл? Как правило, вы определяете строку подключения в файле конфигурации с тем же именем, что и ваш класс DBContext, и вам никогда не нужно использовать конструктор не по умолчанию. – Tejs

+0

Iirc есть установка образца EF на nuget. Но: могу ли я спросить: всегда ли вы предоставляете ему профилированное соединение? Или вы иногда (возможно, в зависимости от пользователя) используете соединение с профилями, а иногда используете голый SQL-соединение? –

+0

@MarcGravell Я сделал это с версией 1.7. Я бы переключился с профилированного соединения (Debug) на sql-соединение в (Release). Он работал нормально. –

ответ

0

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

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

2

Я видел эту ошибку. Это загнало меня в орехи, но я, наконец, понял это. Мой вопрос не имел ничего общего с 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")] 
0

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

1

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

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

2

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

+0

Спасибо, Сэм, это спасло меня. – Bassie

 Смежные вопросы

  • Нет связанных вопросов^_^