Using EF 4.1 and Mini-profiler 1.7. Using model-first, scanned from existing database. EF generates a class that derives from ObjectContext/ObjectSet, not DbContext/DbSet. I couldn't find anywhere to control that.
I tried the popular solutions, to no avail.
Suffering from frustration, I also tried to directly create my Context with an explicit EntityConnection, which was created directly with the ProfiledDbConnection. I wanted to bypass any chance that the connection was not the intended type.
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();
}
}
I have verified that the correct path is taken. However, when actually running a LINQ query, we get an exception:
Unable to cast object of type 'MvcMiniProfiler.Data.ProfiledDbConnection' to type 'System.Data.SqlClient.SqlConnection'.
The offending statement is:
return query.ToList();
The stack trace is even more interesting, because apparently something inside EF absolutely wants a SqlConnection!
at System.Data.SqlClient.SqlCommand.set_DbConnection(DbConnection value) 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) at System.Data.Objects.ObjectQuery
1.GetResults(Nullable
1 forMergeOption) at System.Data.Objects.ObjectQuery1.System.Collections.Generic.IEnumerable.GetEnumerator() at System.Collections.Generic.List
1..ctor(IEnumerable1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable
1 source)
Obviously, if I feed it a SqlConnection instead, everything is happy.
What is going on here? How did this ever work? Maybe it never worked for EDMX case? Does the fact that it is ObjectContext-derived have any bearing?
After upgrading EF (4.1.10715.0) and MiniProfiler (1.9.1) packages, and adding MiniProfiler.EF (1.9.1) package, go into the App_Start module (MiniProfiler.cs) and put the following, instead of the ProfiledDbConnectionFactory
code:
MiniProfilerEF.Initialize();
And all is well!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With