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();
}
}
}
这是你想要的吗? (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- sql-server – 我需要收缩我的数据库 – 我只是释放了很多空
- 浅析SQL Server中包含事务的存储过程
- sql-server – 我可以在构建mssql全文索引时定义要使用的断
- sql – PIVOT行返回到返回值超过1的列
- SQL Server 数据页缓冲区的内存瓶颈分析
- sql-server – 无法添加链接的SQL Server
- SQL Server自己收集比较强大的分页存储过程 推荐
- SQL Server在SQL中使用convert函数进行日期的查询的代码
- T-SQL存储过程NULL输入值导致select语句失败
- sql-server – 运行兼容性级别为80的SQL Server 2005数据库
