我正在使用 EF6 rc1 和 Code First 策略,没有预编译视图,问题是:如果我编译并运行 exe 应用程序,运行第一个查询大约需要 15 秒(没关系,因为我仍在处理 pre - 生成的视图)。但是,如果我使用 Visual Studio 2013 Preview 来调试完全相同的应用程序,则在运行第一个查询之前需要将近 2 分钟:
Dim Context = New MyEntities()
Dim Query = From I in Context.Itens '' <--- The debug takes 2 minutes in here
Dim Item = Query.FirstOrDefault()
有没有办法消除这个额外的时间?我在这里做错了吗?
Ps.:上下文本身并不复杂,它只是充满了 200 多个表。
编辑:发现问题在于,在调试期间,EF 似乎正在生成视图而忽略了预先生成的视图。使用 EF 的源代码,我发现该属性:
IQueryProvider IQueryable.Provider
{
get
{
return _provider ?? (_provider = new DbQueryProvider(
GetInternalQueryWithCheck("IQueryable.Provider").InternalContext,
GetInternalQueryWithCheck("IQueryable.Provider").ObjectQueryProvider));
}
}
是时间被消耗的地方。但这很奇怪,因为调试只需要时间。我在这里错过了什么吗?
编辑:找到与该问题相关的更多信息:Using the Process Monitor (by Sysinternals) 我发现它的“desenv.exe”进程正在消耗大量时间。更具体地说,它消耗“线程退出”的时间。它重复线程退出堆栈 36 次。我不知道这个信息是否很有用,但是我在堆栈中保存了一个“.cvs”,这是他的正文:[...](编辑:删除了“.cvs”正文,我可以再次发布如果有人真的认为它会有用,请通过评论,但它令人困惑且太大。)
编辑:安装了 VS2013 Ultimate 和 Entity Framework 6 RTM。安装了 Entity Framework Power Tools Beta 4 并使用它来生成视图。没有任何改变...如果我运行 exe 需要 20 秒,如果我“开始”调试需要 120 秒。
编辑:创建了一个小项目来模拟错误:http ://sdrv.ms/16pH9Vm 只需在环境里面运行项目,直接通过.exe,点击按钮,比较加载时间。