23

我已通过 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>());

我错过了一些明显的东西吗?我在这里尝试了解决方案,但没有奏效:ASP.NET 的自动迁移

谢谢

编辑:更新通过第一步的关键是创建初始迁移,然后从 Up 和 Down 方法中删除生成的代码(http://thedatafarm.com/blog/data-access/using-ef-migrations-与现有数据库/)。

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

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

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

非常令人沮丧!

4

7 回答 7

27

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

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

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

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

于 2014-04-15T08:51:14.563 回答
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 代码优先迁移

于 2013-03-27T09:18:54.790 回答
2

您不需要手动删除迁移,使用

Remove-Migration

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

在您的情况下,更新数据库失败,因为有现有的表,删除它们

Drop-Database

然后就可以了Update-Database

这些命令的更详细用法在这里

于 2019-04-11T01:45:00.383 回答
1

尝试将旧数据库版本迁移到新模型,数据库与新模型不匹配,或者出现以下错误:

成员 'Npgsql.PostgresException,Npgsql, Version=3.2.2.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7' 的类型未解析

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

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

    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
        AutomaticMigrationDataLossAllowed = true;
    }
    
  4. 执行更新-数据库-强制

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

希望这可以帮助。

于 2017-03-29T11:18:05.097 回答
0

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

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

这应该可以解决问题。

于 2014-02-24T19:45:39.950 回答
0

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

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

添加迁移重置

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

移除迁移

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

添加迁移 InitialMigration

于 2020-05-12T07:02:33.837 回答