在实体框架DatabaseInitializer完成创建表和播种db之前,会启动ASP.NET MVC 3子请求。

| 我有一个将ninject用于DI的ASP.NET mvc3应用程序。该应用程序正在使用Entity Framework 4和数据库初始化程序,该初始化程序还将自定义数据植入db。 数据库初始化程序在HttpApplication.Application_Start中运行。 但是我收到一个错误,因为似乎在数据库初始化程序完成创建和播种db之前调用了子请求:   ObjectContext实例已被处置,不能再用于需要连接的操作。 我的_layout.cshtml有一些子请求:
@Html.Action(\"Present\", \"Time\")
那:
[ChildActionOnly]
public ActionResult Present()
{
    //HttpContext.Trace.Write(\"Inside [ChildActionOnly]\\npublic ActionResult Present() (child requests that is called by _layout.cshtml)\");
    System.Diagnostics.Debugger.Launch();
    Employee employee = this.employeeService.CurrentEmployee;
但是,一旦成功创建数据库并使用名为\“ EFZeiterfassungDataContextInitializer \”的数据库初始化程序(从DropCreateDatabaseIfModelChanges继承)开始,该应用程序便开始工作。 我的第一个(子)请求只有这个问题! 在我的ninject模块中,我这样配置了数据上下文(称为EFZeiterfassungContext):
Bind<EFZeiterfassungContext>().ToSelf().InRequestScope();
更多信息: 这是我的HttpApplication的一些代码:
public void SetupDependencyInjection()
{
    // Create Ninject DI Kernel 
    IKernel kernel = new StandardKernel(new ZeiterfassungNinjectModule());
    //Tell asp.net mvc  to use our ninject di container
    DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));
}

protected void Application_Start()
{
    SetupDependencyInjection();
    AreaRegistration.RegisterAllAreas();
    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);
    InitializeDatabase();
}

private void InitializeDatabase()
{
    IActiveDirectoryService adService = DependencyResolver.Current.GetService<IActiveDirectoryService>();
    IEmployeeService employeeService = DependencyResolver.Current.GetService<IEmployeeService>();
    EFZeiterfassungDataContextInitializer d = new EFZeiterfassungDataContextInitializer(
        Server.MapPath(\"~/Content/UserImages/\"),
        adService,
        employeeService);
    Database.SetInitializer<EFZeiterfassungContext>(d);
}
编辑+解决方法: 显然
Database.SetInitializer(d);
立即返回。初始化程序不会立即运行-甚至不会异步运行。如果您与数据上下文有某种交互,即通过从尚不存在的数据库中查询一些值,EF会首先检查数据库是否有更改。我可以通过在
Database.SetInitializer(d);
之后调用
var currentEm = employeeService.GetById(1);
来解决此问题。因此,数据库实际上是在application_start而不是以后被初始化的。 我想看看
SetInitializer
的一些重载方法,因此您可以立即触发该过程。 在
SetInitializer
具有如此重载的方法之前,我仍然对这个更好的解决方案感兴趣。     
已邀请:

要回复问题请先登录注册