15

我已经通过Nuget将EF 5添加到我的项目中,并通过“Enable-Migrations”命令启用了迁移。然后我称之为“添加迁移”来生成用于生成模式的基本代码。实体框架代码迁移 - 卡在初始迁移

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

调用“添加迁移”再次产生错误:

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. 

但调用“更新-数据库”产生SQL异常,因为表已经存在:

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

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

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

我是密西西比州显而易见的东西? 我在这里尝试了解决方案,但它没有工作:Automatic Migrations for ASP.NET

感谢

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

我可以更新模型和EF映射,然后运行Add-Migration。这会生成正确的向上和向下代码的迁移。

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

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

很沮丧!

+0

您的Migrations目录中是否存在名为201303262144218_Initial.cs的现有文件? – MattSull 2013-03-27 23:04:19

+0

是的。我有点困惑 - 最初的迁移应该是空白的,还是应该在初始状态下创建数据库?另外,我没有__MigrationHistory表(在我的数据库或Master中) – SturmUndDrang 2013-04-05 11:13:49

+0

Initial只是给出特定迁移的名称。有时候人们称他们的第一次迁移为初始如果你有一个现有的数据库,并运行add-migration/update-database命令而不对模型类进行任何修改,那么迁移文件将是空的。删除文件201303262144218_Initial.cs,然后再次运行这两个命令('add-migration newestMigration',然后'update-database'。 – MattSull 2013-04-05 11:45:44

回答

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

+0

好的,所以我删除了初始迁移并运行Enable-Migrations(带-Force)然后我运行了Add-Migration(指定连接字符串),它创建了一个创建整个数据库的迁移(不仅仅是我添加的额外属性)。 – SturmUndDrang 2013-04-05 11:18:23

+1

然后我运行Update- FORCE和我得到“无法更新数据库以匹配当前模型,因为有未决的更改,并且禁用了自动迁移,可以将挂起的模型更改写入基于代码的迁移或启用自动迁移。”为什么很难获得这个工作吗? – SturmUndDrang 2013-04-05 11:25:46

+0

我也试过-examples标志,它只是说“名称更新 - 数据库概要将任何未决的迁移应用到数据库”而没有给出任何示例 – SturmUndDrang 2013-04-05 11:27:18

0

这是一种全面的方法,通常的工作原理:

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

这应该可以做到。

4

I run Update-Database and get the same error again. I try "Update-Database -TargetMigration 201304080859556_MyMigration -Force" but this produces "The specified target migration '201304080859556_MyMigration' does not exist. Ensure that target migration refers to an existing migration id" - It does!

还有一个问题可能会导致你最后的错误(也许它是以前的错误的根本原因)。我有一个类似的问题,事实证明,由于一些奇怪的原因,我的一些迁移类在与我的MigrationConfiguration类的命名空间不同的名称空间中。更正名称空间(也在xxx.Designer.cs文件中)解决了此问题(迁移可见并且再次运行)。

+2

今天我碰到几乎完全相同的问题(设计器文件中的部分类名已被更改,很可能是由于代码合并)。一旦我修复了设计器文件,我就可以应用我所有的迁移。 – DVK 2017-03-28 19:54:09

+0

尝试“更新数据库-TargetMigration MyMigration -Force” – gorums 2017-11-30 18:59:53

20

我有同样的问题,使EF迁移的代码优先模式与现有的数据库,以及以下程序的工作:

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

如果我放弃表格,我将来需要它,否则它会再次创建新的? – 2015-06-10 01:00:45

+0

运行“add-migration”命令时,EF自动重新创建“__MigrationHistory”表。 – MrUpsideDown 2015-06-15 20:19:08

+0

我也发现Visual Studio在某些情况下获得了模型更改跟踪损坏(例如在重构过程中大量模型和迁移更改为最佳解决方案),修复它的唯一方法是删除migrationhistory表或手动回滚更改并从migrationhistory表中删除卡住的迁移。我发现这个EF模型的变化跟踪有时候真的很烦人。 Laravel有迁移,但没有模型跟踪,它工作得很好。我想,这是模型追踪的代价 - 当您想要对抗EF自动追踪时,会增加复杂性和问题。 – JustAMartin 2016-04-13 14:22:28

0

尝试迁移旧的数据库版本,以一种新的模式,无论是数据库不匹配的新模式或我有类似的错误:

Type is not resolved for member 'Npgsql.PostgresException,Npgsql, Version=3.2.2.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7'

下面是它如何工作(使用自动迁移) :

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

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

您的数据库将被更新到最新的计划和准备。

希望这有助于。