Все еще проблемы с профилированием EF Database First - PullRequest
6 голосов
/ 11 августа 2011

Использование EF 4.1 и мини-профайлера 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 (сущность.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands (EntityCommand entityCommand, поведение CommandBehavior) в System.Data.Objects.Internal.ObjectQueryExecutionPlan.Execute [TResultType] (выборка ObjectContext, параметр ObjectVatuesCol)a.Objects.ObjectQuery 1.GetResults(Nullable 1 forMergeOption) в 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 source)

Очевидно, что если я его кормлюВместо этого SqlConnection все устраивает.

Что здесь происходит?Как это работает?Может быть, это никогда не работало для случая EDMX?Имеет ли тот факт, что он является производным от ObjectContext, какое-либо отношение?

1 Ответ

1 голос
/ 23 сентября 2011

После обновления пакетов EF (4.1.10715.0) и MiniProfiler (1.9.1) и добавления пакета MiniProfiler.EF (1.9.1) перейдите в модуль App_Start (MiniProfiler.cs) и поместите следующее вместоProfiledDbConnectionFactory код:

MiniProfilerEF.Initialize();

И все хорошо!

...