2012-02-18 13 views
6

Sto cercando di integrare MvcMiniProfiler nel mio progetto framewok di asp.net mvc + entity. Tutto è ok per la prima richiesta web ma sta dando un'eccezione alle altre richieste.MvcMiniProfiler Impossibile eseguire il cast dell'oggetto di tipo EFProfiledDbConnection

Il mio progetto è
MVC 3
Entity Framework 4.1 (DatabaseFirst + POCO Generatore DbContext)
MvcMiniProfiler.dll 1.9.0.0
MvcMiniProfiler.EntityFramework.dll 1.9.1.0
installo MvcMiniProfiler dal Nu-get

Aggiunto di seguito per global.asax

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

Aggiunto di seguito per 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> 

sto ottenendo questa eccezione

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) 


Eccezione è verificato in EF chiamate in

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

Se cambio versione di MvcMiniProfiler.Data.ProfiledDbProvider in Web.Config da 1,8 Da 0.0 a 1.9.0.0 Un nuovo tipo di eccezione si è verificato nella chiamata a 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() 

risposta

4

Partenza http://code.google.com/p/mvc-mini-profiler/

Ecco un esempio di come utilizzare MVC-mini-profiler con EF Database Primo:

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>(); 
    } 
} 

è quindi possibile registrare i soggetti con un contenitore IOC utilizzando il metodo o in alternativa utilizzare qualcosa come

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

Modifica: Hai dimenticato t o aggiungi

MiniProfilerEF.Initialize();

Viene utilizzato solo per il codice EF.

+0

+1 soluzione utile - appena risolto un bug minore nel vostro 'create' campione – BrokenGlass

+0

ho provato la soluzione, ma ora sto ottenendo un'altra eccezione come qui di seguito System.NotSupportedException: Impossibile determinare il nome del provider per la connessione di tipo 'MvcMiniProfiler.Data.EFProfiledDbConnection'. System.Data.Entity.ModelConfiguration.Utilities.DbConnectionExtensions.GetProviderInvariantName (connessione DbConnection) 613.588 System.Data.Entity.ModelConfiguration.Utilities.DbConnectionExtensions.GetProviderInfo (DbConnection collegamento, DbProviderManifest & providerManifest) +57 System.Data.Entity. DbModelBuilder.Build (DbConnection providerConnection) +159 – Yucel

+0

Hey Yucel, è necessario Entity Framework installato/referenziato nel progetto e aggiuntivo a MvcMiniProfiler: è necessario anche il pacchetto Entity Framework. EntityConnectionStringBuilder analizzerà la stringa di connessione di Entity Framework con metadati specifici di EF. Il ProviderConnectionString è quello a cui siamo abituati (nome, connectionString + provider). Internamente in ADO.NET esiste una fabbrica con provider registrati che crea un'istanza del provider corretto in base all'attributo del provider nella stringa di connessione. Ad esempio, le connessioni MSSQL normalmente utilizzano il provider SqlClient. – Shelakel

6

Forse questo aiuterà. Spostare MiniProfilerEF.Initialize(); nella parte superiore del metodo Application_Start(). Notare che in EF 4.1 e versioni successive il metodo chiamato dovrebbe essere MiniProfilerEF.Initialize_EF42();.

protected void Application_Start() { 
    Logger.Info("Application start"); 
    MiniProfilerEF.Initialize_EF42(); 
    // ... 
} 
Problemi correlati