Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 MVCSCapfolding和数据库同步,用于不断变化的模型_Asp.net Mvc 3_Code First_Asp.net Mvc Scaffolding - Fatal编程技术网

Asp.net mvc 3 MVCSCapfolding和数据库同步,用于不断变化的模型

Asp.net mvc 3 MVCSCapfolding和数据库同步,用于不断变化的模型,asp.net-mvc-3,code-first,asp.net-mvc-scaffolding,Asp.net Mvc 3,Code First,Asp.net Mvc Scaffolding,我使用了Nuget Package Manager中的MVCScaffolding,并遵循了有关其工作原理的简短教程。 这似乎很简单,当我跑的时候 Scaffold Controller Team–Repository-Force它将创建围绕“Team”的所有存储库模式 然而,为了尝试(并且成功)打破这一点,我决定在“Team”类中添加一个额外的字段(myRandomField)。 正如我所料,当我编译时,在MVC视图中出现了一个错误: 自创建数据库以来,支持“MVCAPApplication1

我使用了Nuget Package Manager中的MVCScaffolding,并遵循了有关其工作原理的简短教程。 这似乎很简单,当我跑的时候
Scaffold Controller Team–Repository-Force
它将创建围绕“Team”的所有存储库模式

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

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

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

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

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>());
        }
    }
} 
如果希望保留数据,则必须使用数据迁移工具。我使用了redgate工具()来执行此操作。基本上,这将查看新模式和旧模式,并将现有数据迁移到新模式中,以备测试和部署,所有这些都不涉及原始数据库文件

我想这对你来说应该很好。

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>());
        }
    }
} 
如果希望保留数据,则必须使用数据迁移工具。我使用了redgate工具()来执行此操作。基本上,这将查看新模式和旧模式,并将现有数据迁移到新模式中,以备测试和部署,所有这些都不涉及原始数据库文件


我认为这对您应该很有用。

jad-让我了解一下这里的基本知识。您是希望同步数据库而不丢失现有数据,还是希望看到更改丢弃所有现有数据??如果是前者,那么我将在回答中对此进行说明,否则,只需使用
Database.SetInitializer(new DropCreateDatabaseIfModelChanges())在您的全局数据库中。asax@jimtollan正确,我不想丢失现有数据。jad-让我了解这里的基本知识。您是希望同步数据库而不丢失现有数据,还是希望看到更改丢弃所有现有数据??如果是前者,那么我将在回答中对此进行说明,否则,只需使用
Database.SetInitializer(new DropCreateDatabaseIfModelChanges())在您的全局数据库中。asax@jimtollan正确,我不想丢失现有数据。虽然这不适合我的需要,但迁移建议+1并使用debug only DB initialization.jad-不用担心。是的,
[Conditional(“DEBUG”)]
decorator在这种情况下是一个非常好的救星。很容易就吹走了现场的prod db,否则:-)哎哟…课程的马。#if调试没有编译到最终IL中,而条件调试则编译到最终IL中。还没有找到一个“用例”,它促使我以牺牲可读性为代价从IL中排除条件代码,尽管这不适合我的需要,+1表示迁移建议,并使用debug only DB initialization.jad-不用担心。是的,
[Conditional(“DEBUG”)]
decorator在这种情况下是一个非常好的救星。很容易就吹走了现场的prod db,否则:-)哎哟…课程的马。#if调试没有编译到最终IL中,而条件调试则编译到最终IL中。还没有找到一个“用例”能让我以牺牲可读性为代价将条件代码从IL中排除