在Asp.net上工作mvc5 代码优先 EF-6。我的应用程序数据模型足够大,因此 ObjectContext 具有访问数据库所需的许多类,然后处理类可能会延迟Web应用程序对页面的第一个请求的响应。该怎么办?如何增加应用程序响应?
注意:到目前为止,我知道当应用程序第一次创建ObjectContext的对象时,实体框架会处理访问数据库所需的一组类。在这种情况下,如果您的数据模型很大,那么创建类可能会将Web应用程序响应延迟到第一个页面请求。想知道如何减少这种反应。
答案 0 :(得分:0)
当EF启动时,它将运行数据库初始化程序。如果删除默认为CreateDatabaseIfNotExists<TContext>
Database.SetInitializer<YourContextType>(null); //System.Data.Entity namespace
通常人们将其放在Global.asax或DbContext
答案 1 :(得分:0)
通常,您会在Application_Start
文件的Global.asax
事件中保留任何启动逻辑。但是在第一次用户访问之前不会触发,如果你正在做一些繁重的处理,这需要花费很多时间,对第一个用户来说可能会非常令人沮丧。
要克服这种情况,您可以将应用程序配置为自动启动并执行预加载逻辑。
为此你需要创建一个实现IProcessHostPreloadClient
接口的类,并在其中编写初始化逻辑 -
public class ApplicationPreload : System.Web.Hosting.IProcessHostPreloadClient
{
public void Preload(string[] parameters)
{
// Write initialization and loading logic here
}
}
接下来,您需要通过添加applicationHost.config
属性在startMode="AlwaysRunning"
( C:\ Windows \ System32 \ inetsrv \ config \ applicationHost.config )中注册相关信息到适当的<applicationPools>
-
<applicationPools>
<add name="MyAppWorkerProcess" managedRuntimeVersion="v4.0" startMode="AlwaysRunning" />
</applicationPools>
在同一文件中注册自动启动提供程序 -
<!-- Just AFTER closing the `sites` element AND AFTER `webLimits` tag -->
<serviceAutoStartProviders>
<add name="ApplicationPreload" type="WebApplication1.ApplicationPreload, WebApplication1" />
</serviceAutoStartProviders>
最后,在<Sites>
中,找到您的网站并指定提供商 -
<sites>
<site name="MySite" id="1">
<application path="/" serviceAutoStartEnabled="true"
serviceAutoStartProvider="ApplicationPreload" />
</site>
</sites>
如果您不想对applicationHost.config
进行更改,也可以通过IIS进行这些更改。
更多细节可以在这里找到 - http://weblogs.asp.net/scottgu/auto-start-asp-net-applications-vs-2010-and-net-4-0-series
话虽如此,如果您的设计允许,您还应该尝试最小化启动时所需的数据量,并加载相关的上下文数据。