2011-08-11 11 views
6

Uso de EF 4.1 y Mini-perfilador 1.7. Usando modelo primero, escaneado desde la base de datos existente. EF genera una clase que deriva de ObjectContext/ObjectSet, no de DbContext/DbSet. No pude encontrar ningún lugar para controlar eso.Todavía problemas con el perfil EF Base de datos Primero

Probé las soluciones populares, fue en vano.

Sufriendo de frustración, también traté de crear directamente mi Contexto con una EntityConnection explícita, que se creó directamente con ProfiledDbConnection. Quería eludir cualquier posibilidad de que la conexión no fuera del tipo deseado.

public HomeController() { 
try { 
    string[] paths = new string[] { @"res://*/" }; 
    Assembly[] assys = new Assembly[] { Assembly.GetExecutingAssembly() }; 
    MetadataWorkspace mw = new MetadataWorkspace(paths, assys); 
    string cnx = WebConfigurationManager.ConnectionStrings["XXXX"].ConnectionString; 
    DbConnection cx = MvcMiniProfiler.Data.ProfiledDbConnection.Get(new SqlConnection(cnx), MiniProfiler.Current); 
    //DbConnection cx = Database.DefaultConnectionFactory.CreateConnection(cnx); 
    EntityConnection ec = new EntityConnection(mw, cx); 
    db = new MyContextEntities(ec); 
} 
catch (Exception ex) { 
    Trace.WriteLine("EDM failed: " + ex.Message); 
    db = new MyContextEntities(); 
} 
} 

He verificado que se toma la ruta correcta. Sin embargo, cuando en realidad se ejecuta una consulta LINQ, obtenemos una excepción:

No se puede convertir objeto de tipo 'MvcMiniProfiler.Data.ProfiledDbConnection' para escribir 'System.Data.SqlClient.SqlConnection'.

La declaración infractor es:

return query.ToList(); 

El seguimiento de pila es aún más interesante, porque al parecer algo dentro de EF quiere absolutamente una SqlConnection!

en System.Data.SqlClient.SqlCommand.set_DbConnection (valor DbConnection) en System.Data.Common.DbCommand.set_Connection (valor DbConnection) en System.Data.Common.Utils.CommandHelper.SetStoreProviderCommandState (EntityCommand EntityCommand, EntityTransaction EntityTransaction, DbCommand storeProviderCommand) en System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands (EntityCommand EntityCommand, el comportamiento CommandBehavior) en System.Data.Objects.Internal.ObjectQueryExecutionPlan.Execute [TResultType] (ObjectContext contexto, ObjectParameterCollection parameterValues) en System.Data.Objects.ObjectQuery 1.GetResults(Nullable 1 forMergeOption) en System.Data.Objects.ObjectQuery 1.System.Collections.Generic.IEnumerable.GetEnumerator() at System.Collections.Generic.List 1..ctor (IEnumerable 1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable 1 fuente)

Obviamente, si me alimento que una SqlConnection en cambio, todo lo Es feliz.

¿Qué está pasando aquí? ¿Cómo funcionó esto? Tal vez nunca funcionó para el caso de EDMX? ¿El hecho de que sea derivado de ObjectContext tiene algún efecto?

+0

Estoy experimentando el mismo problema. Todavía no hay solución :( –

+0

¿Está utilizando EF 4.1 'Actualización 1' por casualidad? – kidoman

+0

De acuerdo con los paquetes NuGet, estoy usando EF 4.1.10330.0 y MiniProfiler 1.7. Veo que hay versiones más recientes de ambos paquetes, ¿sería una actualización ¿apropiado? –

Respuesta

1

Después de actualizar los paquetes EF (4.1.10715.0) y MiniFrofiler (1.9.1) y agregar el paquete MiniProfiler.EF (1.9.1), vaya al módulo App_Start (MiniProfiler.cs) y coloque lo siguiente, en lugar de el código ProfiledDbConnectionFactory:

MiniProfilerEF.Initialize(); 

¡Y todo está bien!

Cuestiones relacionadas