sql-server-2008 – 强制首先执行初始化不存在的数据库?
有时我会删除我的开发数据库并运行我的EF代码优先应用程序。我会得到错误:
我认为这是因为DbContext只运行数据库初始化逻辑“AppDomain每次首次使用上下文”,如this page所示。这意味着我需要回收IIS应用程序池以使EF重新创建我的数据库,如果我删除它。 有没有办法我可以得到DB初始化代码运行每次我尝试访问数据库?所以,它将始终检查数据库是否存在,如果不存在,创建它,而不是尝试打开它,即使它使用相同的AppDomain以前访问了我现在删除的数据库? 请注意,我希望对每个查询都进行这个初始化检查,所以即使在Application_Start中完成它也不够用;理想情况下,我想要加载一些数据库数据,删除数据库,然后加载一些数据库数据,它将重新创建数据库,而我甚至不需要重新启动应用程序(基本上我只需要重新加载网页,加载一些DB数据)。 解决方法当您需要访问数据库时执行初始化程序,因此如果要在应用程序启动时创建数据库,请使用以下任何操作:context.Database.Initialize(true); //If set to true the initializer is run even if it has already been run. context.Database.Create() http://msdn.microsoft.com/en-us/library/system.data.entity.database.initialize(v=vs.103).aspx CreateDatabaseIfNotExists Database.SetInitializer<MyContext>(new CreateDatabaseIfNotExists<MyContext>()); http://msdn.microsoft.com/en-us/library/gg679221(v=vs.103).aspx DropCreateDatabaseIfModelChanges
Database.SetInitializer(new DropCreateDatabaseIfModelChanges());
http://msdn.microsoft.com/en-us/library/gg679604(v=vs.103).aspx DropCreateDatabaseAlways 首次在应用程序域中使用上下文时,将始终重新创建数据库并使用数据重新种子数据库的IDatabaseInitializer的实现。要种数据库,创建一个派生类并覆盖种子方法。 Database.SetInitializer<MyContext>(new DropCreateDatabaseAlways<MyContext>()); http://msdn.microsoft.com/en-us/library/gg679506(v=vs.103).aspx 我建议您查看Migrations如果要跟踪,将您对DB的更改还原到先前的状态http://msdn.microsoft.com/hr-hr/data/jj591621。 UPDATE context.Database.Initialize(true);
对于MVC应用程序,在Global.asax中的Application_Start()方法中添加一个部分 protected void Application_Start() { Database.SetInitializer<MyContext>(new DropCreateDatabaseAlways<MyContext>()); // Forces initialization of database on model changes. using (var context= new MyContext()) { context.Database.Initialize(force: true); } } 您也可以使用自定义初始化器: public class MyDbInit : DropCreateDatabaseAlways<MyContext> { } 然后使用 Database.SetInitializer(new MyDbInit()); 更新2 创建一个名为DeleteDBOnEveryRequest的新的空MVC4应用程序。 protected void Application_Start() { AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); Database.SetInitializer<BlogContext>(new DropCreateDatabaseAlways<BlogContext>()); using (var context = new BlogContext()) { context.Database.Initialize(force: true); } } 创建一个名为DatabaseController的新控制器,具有两个操作。 在Access操作中,您删除数据库并重定向到创建数据库的Recreated操作,因为它已被删除。 namespace DeleteDBOnEveryRequest.Controllers { public class DatabaseController : Controller { public ActionResult Access() { using (var context = new BlogContext()) { context.Database.Delete(); } return RedirectToAction("Recreated"); } public ActionResult Recreated() { using (var context = new BlogContext()) { context.Database.Initialize(force: true); } return View(); } } } 这是你想要的吗? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |