MvcMiniProfiler Невозможно привести объект типа EFProfiledDbConnection - PullRequest
6 голосов
/ 19 февраля 2012

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

Мой проектMVC 3Entity Framework 4.1 (DatabaseFirst + POCO Generator DbContext)MvcMiniProfiler.dll 1.9.0.0MvcMiniProfiler.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() 

Ответы [ 2 ]

6 голосов
/ 30 мая 2012

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

protected void Application_Start() {
    Logger.Info("Application start");
    MiniProfilerEF.Initialize_EF42();
    // ...
}
4 голосов
/ 20 февраля 2012

Выезд http://code.google.com/p/mvc-mini-profiler/

Вот пример того, как использовать mvc-mini-profiler с 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>();
    }
}

Затем вы можете зарегистрировать свои объекты в контейнере IOC, используя метод, или альтернативно использовать что-то вроде

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

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

MiniProfilerEF.Initialize ();

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

...