0

我使用了 Nuget 包管理器中的 MVCScaffolding,并遵循了有关其工作原理的简短教程。它看起来很简单,当我运行 Scaffold Controller Team –Repository -Force它时,它将创建围绕“团队”的所有存储库模式的东西。

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

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

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

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

4

1 回答 1

3

杰德,

正如我在上面的评论中提到的,如果您“很高兴”丢失数据库中的所有现有数据,那么您可以将以下内容添加到 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 比较包)来执行此操作。基本上,这会查看您的新架构和旧架构,并将现有数据迁移到新架构中,为测试和部署做好准备,所有这些都无需触及原始 db 文件。

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

于 2012-07-20T14:48:53.833 回答