实体框架代码迁移 - 陷入初始迁移

时间:2013-03-27 08:25:44

标签: entity-framework ef-code-first entity-framework-5 code-migration

我已通过Nuget将EF 5添加到我的项目中,并使用“Enable-Migrations”命令启用了迁移。然后,我调用了“Add-Migration”来生成用于生成模式的基本代码。

然后我向我的一个域对象添加了一个属性(名为“TestProperty”的字符串属性)并添加了一个到我的EntityTypeConfiguration文件的映射(我们现在忽略了约定)。

再次调用“Add-Migration”会产生错误:

Unable to generate an explicit migration because the following explicit migrations are pending: [201303262144218_Initial]. Apply the pending explicit migrations before attempting to generate a new explicit migration.

但是调用“Update-Database”会产生一个sql异常,因为这些表已经存在:

There is already an object named 'Customer' in the database

在我的DbContext的构造函数中,我尝试了不同的更新策略,例如:

Database.SetInitializer<UnitOfWork>(new DropCreateDatabaseAlways<UnitOfWork>());

我错过了一些明显的东西吗? 我在这里尝试了解决方案,但它不起作用:Automatic Migrations for ASP.NET

由于

编辑:更新 超越第一步的关键是创建初始迁移,然后从Up和Down方法(http://thedatafarm.com/blog/data-access/using-ef-migrations-with-an-existing-database/)中删除生成的代码。

然后我可以更新模型和EF地图,然后运行Add-Migration。这会使用正确的Up和Down代码生成迁移。

然后问题是尝试应用更新。 Update-Database产生错误“无法更新数据库以匹配当前模型,因为存在挂起的更改并禁用自动迁移...自动迁移。将DbMigrationsConfiguration.AutomaticMigrationsEnabled设置为true以启用自动迁移。 您可以使用Add-Migration命令将挂起的模型更改写入基于代码的迁移“。好的,我再次尝试Add-Migration,它会生成另一个迁移,其代码与上一个完全相同。

我运行Update-Database并再次获得相同的错误。我尝试“Update-Database -TargetMigration 201304080859556_MyMigration -Force”,但这会产生“指定的目标迁移'201304080859556_MyMigration'不存在。确保目标迁移是指现有的迁移ID” - 确实如此!

非常令人沮丧!

7 个答案:

答案 0 :(得分:22)

我在使用现有数据库的代码优先模型启用EF迁移时遇到了同样的问题,并且以下过程有效:

  1. 删除项目中的现有Migrations文件夹,并从现有数据库中删除表__MigrationHistory
  2. 从程序包管理器控制台运行enable-migrations命令。
  3. 运行add-migration命令以创建初始迁移。
  4. 删除Up()方法中的所有代码以进行初始迁移。
  5. 运行update-database命令将初始迁移应用于数据库。 这不会对现有对象进行任何更改(因为Up()方法不包含代码),但它将现有数据库标记为已迁移到初始状态。
  6. 更改代码优先模型。
  7. 运行add-migration命令以创建新的迁移。 新迁移的Up()方法中的代码仅包含对象模型的更改。
  8. 运行update-database命令将更改应用于您的数据库。

答案 1 :(得分:7)

  

我运行Update-Database并再次获得相同的错误。我尝试“Update-Database -TargetMigration 201304080859556_MyMigration -Force”,但这会产生“指定的目标迁移'201304080859556_MyMigration'不存在。确保目标迁移是指现有的迁移ID” - 确实如此!

还有一个问题可能导致您的上一次错误(也许这是以前错误的根本原因)。我遇到了类似的问题,结果发现,由于某些奇怪的原因,我的一些迁移类位于与MigrationConfiguration类的命名空间不同的命名空间中。更正命名空间(也在xxx.Designer.cs文件中)解决了这个问题(迁移是可见的并且再次工作)。

答案 2 :(得分:3)

您是否尝试使用 -force 参数来应用更改。

Update-Database [-SourceMigration <String>]
  [-TargetMigration <String>] [-Script] [-Force] [-ProjectName <String>]
  [-StartUpProjectName <String>] [-ConfigurationTypeName <String>]
  [-ConnectionStringName <String>] [<CommonParameters>]

<强> -force 指定在自动迁移期间数据丢失是可接受的 数据库中。

您可以使用get-help Update-Database -examples查看使用示例。

进一步阅读:EF Code First Migrations

答案 3 :(得分:0)

这是一种通常有效的一揽子方法:

  1. 删除整个“迁移”文件夹(确保在迁移配置文件中复制可能已从种子方法创建的任何代码)。
  2. 删除实际的数据库。如果您使用的是LocalDb,则通常位于AppData解决方案文件夹中(右键单击 - &gt;打开文件夹位置)。确保删除.mdf&amp; .log数据库文件。
  3. 转到程序包管理器控制台。输入enable-migrations -projectname yourprojectname
  4. 转到程序包管理器控制台。输入add-migration "Initial" -projectname yourprojectname
  5. 打开迁移配置文件,并将您从步骤1复制的代码粘贴到种子方法中。
  6. 转到程序包管理器控制台。输入update-database -projectname yourprojectname
  7. 这应该可以解决问题。

答案 4 :(得分:0)

尝试将旧的db版本迁移到新模型,要么数据库与新模型不匹配,要么出现如下错误:

  

没有为成员解析类型&#39; Npgsql.PostgresException,Npgsql,   Version = 3.2.2.0,Culture = neutral,PublicKeyToken = 5d8b90d52f46fda7&#39;

以下是它的工作原理(使用自动迁移):

  1. 删除迁移文件夹
  2. 执行enable-migrations
  3. 在新创建的Configuration.cs中将这两个属性设置为true

    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
        AutomaticMigrationDataLossAllowed = true;
    }
    
  4. 执行Update-Database -Force

  5. 您的数据库将更新为最新方案并准备就绪。

    希望这会有所帮助。

答案 5 :(得分:0)

您无需手动删除迁移,只需使用

即可轻松删除
Remove-Migration

然后您可以使用Add-Migration重新创建迁移脚本。

在您的情况下,由于存在现有表,因此更新数据库失败

Drop-Database

然后您可以Update-Database

这些命令的更详细用法是here

答案 6 :(得分:0)

1)删除项目中现有的Migrations文件夹,然后从Migration_History表中删除现有的迁移(如果有)。

2)从程序包管理器控制台中运行以下命令:

添加迁移重置

3)之后,从程序包管理器控制台中运行以下命令:

删除迁移

4)之后,从程序包管理器控制台中运行以下命令(InitialMigration是第一个迁移的名称,您可以根据需要命名):

添加迁移InitialMigration