Использование EF 4.1 и Mini-profiler 1.7. Использование модели сначала, сканирование из существующей базы данных. EF создает класс, производный от ObjectContext / ObjectSet, а не от DbContext / DbSet. Я не мог найти нигде, чтобы это контролировать.
Я пробовал популярные решения, но безрезультатно.
Страдая от разочарования, я также попытался напрямую создать свой контекст с явным EntityConnection, который был создан непосредственно с ProfiledDbConnection . Я хотел избежать любого шанса, что соединение не было предполагаемым типом.
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();
}
}
Я убедился, что выбран правильный путь. Однако при фактическом выполнении запроса LINQ мы получаем исключение:
Невозможно преобразовать объект типа MvcMiniProfiler.Data.ProfiledDbConnection для ввода 'System.Data.SqlClient.SqlConnection'.
Оскорбительное утверждение:
return query.ToList();
Трассировка стека еще более интересна, потому что, очевидно, что-то внутри EF абсолютно хочет SqlConnection!
в System.Data.SqlClient.SqlCommand .set_DbConnection (значение DbConnection) в System.Data.Common.DbCommand.set_Connection (значение DbConnection) в System.Data.Common.Utils.CommandHelper.SetStoreProviderCommandState (EntityCommand entityCommand, EntityTransaction entityTransaction, DbCommand storeProviderCommand) в System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands (EntityCommand entityCommand, поведение CommandBehavior) в System.Data.Objects.Internal.ObjectQueryExecutionPlan.Execute [TResultType] (ObjectContext context, ObjectParameterCollection parameterValues) в System.Data.Objects.ObjectQuery
1.GetResults (Nullable
1 forMergeOption) в System.Data.Objects.ObjectQuery1.System.Collections.Generic.IEnumerable.GetEnumerator () в System.Collections.Generic.List
1..ctor (IEnumerable1 коллекция) в System.Linq.Enumerable.ToList [TSource] (IEnumerable
1 источник)
Очевидно, если я скармливаю ему SqlConnection вместо этого, все будет хорошо.
Что здесь происходит? Как это вообще работало? Может, в случае с EDMX это никогда не сработало? Имеет ли значение тот факт, что он является производным от ObjectContext?