使用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.ObjectQuery1.System.Collections.Generic.IEnumerable.GetEnumerator() at System.Collections.Generic.List
1..ctor(IEnumerable1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable
1 source)
显然,如果我给它一个SqlConnection,那么一切都很开心。
这里发生了什么?这怎么工作?也许它从来没有用于EDMX案例?它是ObjectContext派生的事实是否有任何影响?
答案 0 :(得分:1)
升级EF(4.1.10715.0)和MiniProfiler(1.9.1)软件包,并添加MiniProfiler.EF(1.9.1)软件包后,进入App_Start模块(MiniProfiler.cs)并输入以下内容,而不是ProfiledDbConnectionFactory
代码:
MiniProfilerEF.Initialize();
一切都很好!