【问题标题】:Why are my EF Code First pregenerated views having no effect?为什么我的 EF Code First 预生成视图没有效果?
【发布时间】:2012-07-17 15:25:57
【问题描述】:

我的上下文中有大约 300 个 DbSet,应用加载后的第一个查询(索引字段上的 FirstOrDefault())需要大约 40 秒。

为了改进这一点,我尝试在 EF 4.3.1 Code First 中使用 T4 模板在此处使用预生成的视图:

http://blog.3d-logic.com/2012/06/13/entity-framework-codefirst-view-generation-templates-on-visual-studio-code-gallery/

我编译它,但我看不出性能差异。我希望/假设它会帮助我正在经历痛苦的​​缓慢启动,但没有运气。

应该有帮助吗?如果不是,那么预生成的视图到底是做什么用的?而且,我可以做些什么来缩短启动时间?至少可以说,拆分我的上下文很痛苦。

【问题讨论】:

  • ASP.NET 中的预编译视图有些奇怪。我也遇到了同样的问题。

标签: c# asp.net entity-framework-4 entity-framework-4.3


【解决方案1】:

NHibernate 和 EF 等某些 ORM 的启动速度很慢。我不想尝试“修复”这种缓慢,而是通过确保 IIS 在应用程序池启动时触发此代码来消除问题。为此,您必须将 IIS 配置为自动启动您的应用程序池。此解决方案仅适用于 .NET 4 和 IIS7.5 及更高版本。

您希望使用IProcessHostPreloadClient 实现一个类,该类加载一个ObjectContext,并通过将 serviceAutoStartProviders 节点添加到您的 web.config 并为您的应用程序应用程序池设置 startMode="AlwaysRunning" 来配置您的应用程序以使用它。

详情请参考Scott Gu's blog。

【讨论】:

  • 这是一个很好的解决方案,但是由于我无法控制的痛苦原因,我被困在 IIS6/32 位 Window Server 2003 上,所以我无法使用 IProcessHostPreloadClient 并且该站点从外部回收-中午一直在记忆中......
  • 定期回收不是问题。该方法只是确保应用程序池再次启动,而正常行为是在呼叫到达之前它不会启动。然而,IIS6 将是一个破坏者。 Windows 服务中的自托管是一种选择吗?
  • 这是一个问题——用户正在使用该站点,触发了回收,他的下一个请求进入了新的应用程序池,这需要很长时间,看起来该站点已挂起。
【解决方案2】:

事实证明,它实际上似乎是在第一个引用实体所在的程序集中搜索预生成的视图,而不是在 DbContext 所在的程序集中。在此处查看更多讨论:http://blog.3d-logic.com/2012/06/13/entity-framework-codefirst-view-generation-templates-on-visual-studio-code-gallery/#comment-76。

为了解决这个问题,我创建了一个新实体并将其放入上下文的程序集中,并将其列为第一个 DbSet。现在它捡起来了,而且效果很好(除了这很荒谬)。

【讨论】:

  • 数据库和模型优先也存在这种行为。我预先生成的视图是在同一个程序集中使用上下文编译的。它们在控制台或 Windows 服务应用程序中被拾取,但不在 IIS 下。我能够看到它,因为我使用的是 T4 来生成它们,并添加了日志。
  • 有同样的问题,但我不明白解决方案。我的 POCO 实体有一个装配体,我的 edmx 有另一个装配体。我需要在我的程序集中创建一个具有 edmx 的实体?我如何将它列为第一个 DBContext?谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-22
  • 1970-01-01
  • 1970-01-01
  • 2011-09-11
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多