Asp.net mvc 3 MVCSCapfolding和数据库同步,用于不断变化的模型
我使用了Nuget Package Manager中的MVCScaffolding,并遵循了有关其工作原理的简短教程。 这似乎很简单,当我跑的时候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
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中排除