25

我有使用 Entity Framwork 4.3 及其迁移的 ASP.NET MVC 3 项目。现在我希望 Entity Framework 使用我已经拥有的迁移为我创建一个数据库。当我尝试运行 Update-Database 脚本时,它给了我以下信息:

Update-Database -Verbose -ProjectName AssemblyWithMigrations -StartUpProjectName WebProjectAssembly No migrations configuration type was found in the assembly '/* my name of assembly */'. (In Visual Studio you can use the Enable-Migrations command from Package Manager Console to add a migrations configuration).

但是,当我尝试运行时,Enable-Migrations我看到以下内容:

Migrations have already been enabled in project 'AssemblyWithMigrations '. To overwrite the existing migrations configuration, use the -Force parameter.

所以,我想,问题是 EF 试图解决当前迁移版本以更新数据库。但是数据库不存在,它显然失败了。

问题是:如果数据库不存在,如何使用 EF 迁移来创建数据库?或者,使用 Nuget 控制台的正确方法是什么?

总而言之,我想要的是: 1. 运行命令(也许update-database),它将使用我的 web.config 文件创建数据库 2. 所有迁移都将按照创建顺序应用于创建的数据库。

谢谢。:)

4

2 回答 2

54

我意识到这是一个老问题,但到底是什么......

为了使迁移能够创建初始数据库,我发现以下方法效果很好。

  1. 从 SQL Server 对象资源管理器中删除数据库
  2. 从 Migrations 文件夹中删除所有现有的迁移。
  3. 在 Package-Management-Console 中输入“Add-Migration InitialCreate”

    [可选,取决于您的数据库初始化程序]

  4. 在 Package-Management-Console 中输入“update-database”

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

于 2013-05-01T16:28:58.230 回答
5

Using Migrations is very useful but at times I have found it's better to use the following statements when working with databases.

Database initialization strategies: use any of the commented statements relevant to you.

public DataContext(): base("DefaultConnection") 
{
  // Database.SetInitializer<DataContext>(new CreateDatabaseIfModelChanges<DataContext>());
  // Database.SetInitializer<DataContext>(new CreateDatabaseIfNotExists<DataContext>());                                                            
  // Database.SetInitializer<DataContext>(new DropCreateDatabaseAlways<DataContext>());
}                                                                                                                                                                                                                                                   
于 2014-07-29T14:55:54.580 回答