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

时间:2011-08-11 16:46:41

标签: asp.net-mvc-3 entity-framework-4.1 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();
}
}

我已经确认已采取正确的路径。但是,当实际运行LINQ查询时,我们得到一个异常:

  

无法投射类型的对象   输入'MvcMiniProfiler.Data.ProfiledDbConnection'   'System.Data.SqlClient.SqlConnection'。

令人不快的陈述是:

return query.ToList();

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

  

at System.Data.SqlClient.SqlCommand.set_DbConnection(DbConnection value)   在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行为)   at System.Data.Objects.Internal.ObjectQueryExecutionPlan.Execute [TResultType](ObjectContext   context,ObjectParameterCollection parameterValues)   在System.Data.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 个答案:

答案 0 :(得分:1)

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

MiniProfilerEF.Initialize();

一切都很好!