问题描述
|
我有一个将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
具有如此重载的方法之前,我仍然对这个更好的解决方案感兴趣。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)