MVCScaffolding和数据库同步,用于不断变化的模型

时间:2012-07-20 13:43:40

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

我使用过Nuget Package Manager的MVCScaffolding,并按照简要教程了解它是如何工作的。 看起来很简单,当我跑步时 Scaffold Controller Team –Repository -Force它将创建围绕“团队”的所有存储库模式。

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

  

自创建数据库以来,支持'MvcApplication1Context'上下文的模型已更改。手动删除/更新数据库,或使用IDatabaseInitializer实例调用Database.SetInitializer。例如,DropCreateDatabaseIfModelChanges策略将自动删除并重新创建数据库,并可选择使用新数据对其进行播种。

显然这个错误是因为我更新了模型(Code-first ??),而且数据库现在与我的模型“不同步”。

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

1 个答案:

答案 0 :(得分:3)

JAD,

如上面的评论所述,如果您“很高兴”丢失数据库中的所有现有数据,那么您可以将以下内容添加到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);
}

如果您希望保留数据,则必须使用数据迁移工具。我使用红门工具(SQL Comparison Bundle)来实现这一点。基本上,这会查看新架构和旧架构,并将现有数据迁移到新架构中,准备进行测试和部署,所有这些都不会触及原始db文件。

我认为这应该适合你。