我使用过Nuget Package Manager的MVCScaffolding,并按照简要教程了解它是如何工作的。
看起来很简单,当我跑步时
Scaffold Controller Team –Repository -Force
它将创建围绕“团队”的所有存储库模式。
然而,在尝试(并且成功)打破这一点时,我决定在“团队”类(myRandomField
)中添加一个额外的字段。
正如我所料,当我编译时,我在MVC视图中遇到了一个错误:
自创建数据库以来,支持'MvcApplication1Context'上下文的模型已更改。手动删除/更新数据库,或使用IDatabaseInitializer实例调用Database.SetInitializer。例如,DropCreateDatabaseIfModelChanges策略将自动删除并重新创建数据库,并可选择使用新数据对其进行播种。
显然这个错误是因为我更新了模型(Code-first ??),而且数据库现在与我的模型“不同步”。
解决此问题的最佳方法是什么?是否有一种简单的方法来与模型进行数据库同步 - 我计划对我的模型进行大量编辑,因为我开始的项目将逐步推出(因此,每次进行完整的数据库重建都是问题)在这种情况下,代码首先是正确的方法吗?我真的很喜欢这个插件/工具,不使用它会很遗憾。
答案 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文件。
我认为这应该适合你。