2012-02-18 4 views
6

Я пытаюсь интегрировать MvcMiniProfiler в проект asp.net mvc + entity framewok. Все в порядке для веб-запроса в первый раз, но оно дает исключение при других запросах.MvcMiniProfiler Невозможно создать объект типа EFProfiledDbConnection

Мой Проект
MVC 3
Entity Framework 4.1 (DatabaseFirst + POCO генератор DbContext)
MvcMiniProfiler.dll 1.9.0.0
MvcMiniProfiler.EntityFramework.dll 1.9.1.0
установить MvcMiniProfiler от Nu-Get

Добавлено ниже global.asax

protected void Application_BeginRequest() 
    { 
     if (Request.IsLocal) 
     { 
      MvcMiniProfiler.MiniProfiler.Start(); 
      MiniProfilerEF.Initialize();  
     } 
    } 

Добавлено ниже web.config

<system.data> 
    <DbProviderFactories> 
     <remove invariant="MvcMiniProfiler.Data.ProfiledDbProvider" /> 
     <add name="MvcMiniProfiler.Data.ProfiledDbProvider" invariant="MvcMiniProfiler.Data.ProfiledDbProvider" description="MvcMiniProfiler.Data.ProfiledDbProvider" type="MvcMiniProfiler.Data.ProfiledDbProviderFactory, MvcMiniProfiler, Version=1.8.0.0, Culture=neutral, PublicKeyToken=b44f9351044011a3" /> 
    </DbProviderFactories> 
    </system.data> 

Я получаю это исключение

System.InvalidCastException was unhandled by user code 
    Message=Unable to cast object of type 'MvcMiniProfiler.Data.EFProfiledDbConnection' to type 'System.Data.SqlClient.SqlConnection'. 
    Source=System.Data 
    StackTrace: 
     at System.Data.SqlClient.SqlCommand.set_DbConnection(DbConnection value) 
     at System.Data.Common.DbCommand.set_Connection(DbConnection value) 
     at MvcMiniProfiler.Data.ProfiledDbCommand.set_DbConnection(DbConnection value) in C:\Users\sam\Desktop\mvc-mini-profiler\MvcMiniProfiler\Data\ProfiledDbCommand.cs:line 118 
     at System.Data.Common.DbCommand.set_Connection(DbConnection value) 
     at System.Data.Common.Utils.CommandHelper.SetStoreProviderCommandState(EntityCommand entityCommand, EntityTransaction entityTransaction, DbCommand storeProviderCommand) 
     at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior) 
     at System.Data.Objects.Internal.ObjectQueryExecutionPlan.Execute[TResultType](ObjectContext context, ObjectParameterCollection parameterValues) 


Исключение произошло в EF вызовов

ModaEntitiesWrapper.GetInstance().Articles 
       .AsNoTracking() 
       .Where(p => p.StatusId == 1).ToList(); 

Если изменить версию MvcMiniProfiler.Data.ProfiledDbProvider в Web.Config от 1,8 .0.0 до 1.9.0.0 В вызове MiniProfilerEF.Initialize() произошел новый тип исключения.

System.IndexOutOfRangeException was unhandled by user code 
    Message=The given DataRow is not in the current DataRowCollection. 
    Source=System.Data 
    StackTrace: 
     at System.Data.DataRowCollection.Remove(DataRow row) 
     at MvcMiniProfiler.MiniProfilerEF.Initialize() 

ответ

4

Заканчивать http://code.google.com/p/mvc-mini-profiler/

Вот пример того, как использовать MVC-мини-профайлер с EF Database First:

public static class Entities 
{ 
    public static MyEntities Create() 
    { 
     var builder = new EntityConnectionStringBuilder(ConfigurationManager.ConnectionStrings["MyEntities"].ConnectionString); 
     var sqlConnection = new SqlConnection(builder.ProviderConnectionString); 
     var profiledConnection = new EFProfiledDbConnection(sqlConnection, MiniProfiler.Current); 

     return profiledConnection.CreateObjectContext<MyEntities>(); 
    } 
} 

Вы можете зарегистрировать свои объекты с контейнером МОК с использованием или в качестве альтернативы использовать что-то вроде

using(var entities = Entities.Create()) 
{ 
    //Do stuff here 
    entities.SaveChanges(); 
} 

Редактировать: Забыл (а) t o добавить

MiniProfilerEF.Initialize();

Это используется только для EF Code First.

+0

+1 Полезный ответ - просто исправлен недочет в вашем 'Create' образца – BrokenGlass

+0

Я попробовал ваше решение, но теперь я получаю еще одно исключение, как показано ниже System.NotSupportedException: Не удалось определить имя провайдера для подключения типа «MvcMiniProfiler.Data.EFProfiledDbConnection». System.Data.Entity.ModelConfiguration.Utilities.DbConnectionExtensions.GetProviderInvariantName (соединение DbConnection) +613588 System.Data.Entity.ModelConfiguration.Utilities.DbConnectionExtensions.GetProviderInfo (DbConnection соединение, DbProviderManifest & providerManifest): +57 System.Data.Entity. DbModelBuilder.Build (DbConnection providerConnection) +159 – Yucel

+0

Эй, Юзель, вам необходимо, чтобы Entity Framework была установлена ​​/ указана в вашем проекте и дополнена MvcMiniProfiler - вам также нужен пакет Entity Framework. EntityConnectionStringBuilder будет анализировать строку подключения Entity Framework с конкретными метаданными EF. ProviderConnectionString - это тот, к которому мы привыкли (name, connectionString + provider). Внутренне в ADO.NET существует фабрика с зарегистрированными поставщиками, которая создает правильный поставщик на основе атрибута поставщика в строке подключения. Например, MSSQL-подключения обычно используют поставщика SqlClient. – Shelakel

6

Возможно, это поможет. Переместите MiniProfilerEF.Initialize(); в начало метода Application_Start(). Обратите внимание, что в EF 4.1 и выше метод, который должен быть вызван, должен быть равен MiniProfilerEF.Initialize_EF42();.

protected void Application_Start() { 
    Logger.Info("Application start"); 
    MiniProfilerEF.Initialize_EF42(); 
    // ... 
} 
Смежные вопросы