【问题标题】:MVCScaffolding and Database Sync for constantly-changing modelMVCScaffolding 和 Database Sync 用于不断变化的模型
【发布时间】:2012-07-19 19:17:58
【问题描述】:

我使用了来自 Nuget 包管理器的 MVCScaffolding,并按照简要教程了解了它的工作原理。 看起来很简单,当我跑步时 Scaffold Controller Team –Repository -Force 它将创建围绕“团队”的所有存储库模式内容。

但是,为了尝试(并成功)打破这一点,我决定在“团队”类中添加一个额外的字段 (myRandomField)。 正如我所料,当我编译时,MVC 视图中出现错误:

支持“MvcApplication1Context”上下文的模型在创建数据库后发生了变化。手动删除/更新数据库,或使用 IDatabaseInitializer 实例调用 Database.SetInitializer。例如,DropCreateDatabaseIfModelChanges 策略将自动删除并重新创建数据库,并可选择为其添加新数据。

很明显,这个错误是因为我更新了模型(代码优先??)并且数据库现在与我的模型“不同步”。

解决此问题的最佳方法是什么?是否有一种简单的方法可以与模型进行数据库同步 - 我计划对我的模型进行大量编辑,因为我开始的项目将逐渐推出(因此每次都进行完整的数据库重建是不可能的)在这种情况下,代码优先对我来说是正确的方法吗?我真的很喜欢这个插件/工具,如果不使用它会很遗憾。

【问题讨论】:

  • jad - 让我了解这里的基础知识。您是否希望在不丢失现有数据的情况下同步数据库,或者您是否乐于看到更改丢弃所有现有数据?如果是前者,那么我会在答案中解决这个问题,否则,只需在 global.asax 中使用Database.SetInitializer(new DropCreateDatabaseIfModelChanges<YourContext>());
  • @jimtollan 正确,我不想丢失现有数据。

标签: asp.net-mvc-3 code-first asp.net-mvc-scaffolding


【解决方案1】:

杰德,

正如我在上面的评论中提到的,如果您“很高兴”丢失数据库中的所有现有数据,那么您可以将以下内容添加到 global.asax 中:

[Conditional("DEBUG")]
private static void InitializeDb()
{
    using (var db = new YourContext())
    {
        // double indemnity to ensure just sqlserver express
        if (db.Database.Connection.DataSource != null
            && db.Database.Connection.DataSource.IndexOf("sqlexpress", 
            StringComparison.InvariantCultureIgnoreCase) > -1)
        {
            // Initializer code here
            Database.SetInitializer(new DropCreateDatabaseIfModelChanges<YourContext>());
        }
    }
} 

然后从Application_Start() 调用它,即

protected void Application_Start()
{
    InitializeDb();
    ViewEngines.Engines.Add(new MobileViewEngine());
    AreaRegistration.RegisterAllAreas();

    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);
}

如果您希望保留数据,则必须使用数据迁移工具。我使用 Red Gate 工具 (SQL Comparison Bundle) 来执行此操作。基本上,这会查看您的新架构和旧架构,并将现有数据迁移到新架构中,为测试和部署做好准备,所有这些都无需触及原始 db 文件。

我认为这对你应该很有效。

【讨论】:

  • 虽然这不适合我的需要,但迁移建议 +1 并使用仅调试数据库初始化。
  • jad - 不用担心。是的,[Conditional("DEBUG")] 装饰器在这种情况下是一个很棒的救生员。否则很容易最终吹走现场产品数据库:-) 哎哟......
  • jad - 课程用马。 #if 调试不会编译到最终的 IL 中,而条件调试则可以。还没有找到一个“用例”让我以牺牲可读性为代价从 IL 中排除条件代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多