如何使用Code First Migrations创建数据库?

28
我有一个使用Entity Framework 4.3和其迁移的ASP.NET MVC 3项目。现在我想让Entity Framework使用我已经有的迁移为我创建一个数据库。但是,当我尝试运行Update-Database脚本时,它会给我以下提示:
Update-Database -Verbose -ProjectName AssemblyWithMigrations -StartUpProjectName WebProjectAssembly 没有在程序集'/*我的程序集名称*/'中找到迁移配置类型。(在Visual Studio中,你可以使用包管理器控制台的Enable-Migrations命令添加迁移配置)。
然而,当我尝试运行Enable-Migrations时,我看到以下内容:
迁移已在项目“AssemblyWithMigrations”中启用。要覆盖现有的迁移配置,请使用-Force参数。
所以,问题是EF尝试解析要更新数据库的当前迁移版本,我想。但是数据库不存在,很明显会失败。
问题是:如何使用EF迁移来创建不存在的数据库?或者,使用Nuget控制台正确的方式是什么?
总之,我想要: 1. 运行命令(可能是update-database),它将使用我的web.config文件创建数据库 2. 所有迁移将按照它们的创建顺序应用于已创建的数据库。
谢谢。 :)

2
我认为迁移不仅仅是用于创建数据库,还可以用于更新它们。 - undefined
1
如果数据库不存在,Update-Database 将自动创建它并应用每个迁移。您有其他信息吗?在同一个项目中同时获取 "找不到迁移配置类型" 和 "已启用迁移" 应该永远不会发生。 - bricelam
2个回答

58

我知道这是一个老问题,但是管它呢....

我发现以下方法很好地实现了初始数据库的迁移。

  1. 在 SQL Server Object Explorer 中删除你的数据库。
  2. 在 Migrations 文件夹内删除所有现有的迁移。
  3. 在 Package-Management-Console 中键入 "Add-Migration InitialCreate"

    [根据你的数据库初始化程序需求,此步骤可选]

  4. 在 Package-Management-Console 中键入 "update-database"

这将为您提供一个单一的迁移脚本,该脚本将使您从“没有数据库”到拥有与当前模型匹配的数据库。


谢谢你的回答。我现在无法测试这个解决方案,但我相信它会起作用。 - sigurd
第四步是:在PM控制台中键入“Update-Database”,以实际创建数据库。 - Göran Roseen
相当正确-根据您的数据库初始化程序,这一步骤可能也是必需的。我使用一个MigrateDatabaseToLatestVersion初始化程序。 - Dave R
我本来想编辑你的答案,包括Add-Migrationupdate-database的文档链接,但是我找不到它们!我找到的最接近的是Anders Abel的博客文章,他收集了运行包管理器控制台命令(如get-help Add-Migration -detailed)的输出。 - dumbledad
1
这仅适用于一个数据库上下文,如果有多个,则会失败,我们如何强制更新第二个数据库? - Transformer
显示剩余2条评论

5

使用迁移非常有用,但有时在处理数据库时最好使用以下语句。

数据库初始化策略:使用与您相关的任何已注释语句。

public DataContext(): base("DefaultConnection") 
{
  // Database.SetInitializer<DataContext>(new CreateDatabaseIfModelChanges<DataContext>());
  // Database.SetInitializer<DataContext>(new CreateDatabaseIfNotExists<DataContext>());                                                            
  // Database.SetInitializer<DataContext>(new DropCreateDatabaseAlways<DataContext>());
}                                                                                                                                                                                                                                                   

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接