分析EF数据库优先的问题仍然存在

esc*_*llc 6 entity-framework-4.1 asp.net-mvc-3 mvc-mini-profiler

使用EF 4.1和Mini-profiler 1.7.使用模型优先,从现有数据库扫描.EF生成一个派生自ObjectContext/ObjectSet的类,而不是DbContext/DbSet.我无法找到控制它的地方.

我尝试了流行的解决方案,但无济于事.

由于受挫,我还尝试使用显式的EntityConnection直接创建我的Context,这是直接使用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();
}
}
Run Code Online (Sandbox Code Playgroud)

我已经验证了正确的路径.但是,当实际运行LINQ查询时,我们得到一个异常:

无法将类型为"MvcMiniProfiler.Data.ProfiledDbConnection"的对象强制转换为"System.Data.SqlClient.SqlConnection".

违规声明是:

return query.ToList();
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪更有趣,因为显然EF内部的东西绝对需要SqlConnection!

在system.Data.SqlClient.SqlCommand.set_DbConnection(DbConnection值)处于System.Data.Common.Utils.CommandHelper.SetStoreProviderCommandState(EntityCommand entityCommand,EntityTransaction entityTransaction,DbCommand storeProviderCommand)的System.Data.Common.DbCommand.set_Connection(DbConnection值)处System.Data.Object.ExecuteClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand,CommandBehavior behavior)at System.Data.Objects.Internal.ObjectQueryExecutionPlan.Execute [TResultType](ObjectContext context,1.GetResults(NullableObjectParameterCollection parameterValues)at System.Data.Objects.ObjectQuery 1 forMergeOption)在System.Data.Objects.ObjectQuery 1.System.Collections.Generic.IEnumerable.GetEnumerator() at System.Collections.Generic.List1..ctor(IEnumerable 1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable1 source)

显然,如果我给它一个SqlConnection,那么一切都很开心.

这里发生了什么?这怎么工作?也许它从来没有用于EDMX案例?它是ObjectContext派生的事实是否有任何影响?

esc*_*llc 1

升级 EF (4.1.10715.0) 和 MiniProfiler (1.9.1) 软件包并添加 MiniProfiler.EF (1.9.1) 软件包后,进入 App_Start 模块 (MiniProfiler.cs) 并输入以下内容,而不是代码ProfiledDbConnectionFactory

MiniProfilerEF.Initialize();
Run Code Online (Sandbox Code Playgroud)

一切都很好!