实体框架代码迁移 - 憋屈初始迁移(Entity Framework Code Migrations

2019-07-28 03:19发布

我已经通过的NuGet加入EF 5到我的项目,并启用了“启用的迁移”命令迁移。 后来我也被称为“添加迁移”来生成用于生成模式的基本代码。

然后我添加了一个属性(称为“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>());

我失去了一些东西明显? 我在这里尝试了解决方案,但它没有工作: 为ASP.NET自动迁移

谢谢

编辑:更新,以获得过去的第一步,关键是要创建初始迁移,然后删除向上和向下方法生成的代码( http://thedatafarm.com/blog/data-access/using-ef-migrations-与-AN-现有数据库/ )。

然后我就可以更新模型和EF地图,然后运行添加迁移。 这将生成正确的向上和向下代码迁移。

然后,问题是试图以应用更新。 更新数据库产生错误“无法更新数据库,因为有挂起的更改,并自动迁移到当前的匹配模型是禁用...自动迁移。设置DbMigrationsConfiguration.AutomaticMigrationsEnabled为true启用自动迁移。您可以使用Add-迁移命令写入到基于代码的迁移”挂起模式的变化。 好了,我再试一次添加,迁移和它产生完全相同的代码作为最后彼此迁移。

我跑更新,数据库,并再次得到同样的错误。 我尝试“更新,数据库-TargetMigration 201304080859556_MyMigration - 强制”,但这种生产“指定目标的迁移‘201304080859556_MyMigration’不存在,确保目标的迁移是指现有的移民ID。” - 它呢!

很沮丧!

Answer 1:

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

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


Answer 2:

我跑更新,数据库,并再次得到同样的错误。 我尝试“更新,数据库-TargetMigration 201304080859556_MyMigration - 强制”,但这种生产“指定目标的迁移‘201304080859556_MyMigration’不存在,确保目标的迁移是指现有的移民ID。” - 它呢!

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



Answer 3:

你有没有尝试使用强制参数应用更改。

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迁移



Answer 4:

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

  1. 删除整个文件夹迁移(请确保您复制,你可能从种子法在迁移配置文件创建的任何代码)。
  2. 删除实际的数据库。 如果你正在使用的LocalDB,这通常会您的应用程序数据解决方案文件夹内坐(右击 - >打开文件夹的位置)。 确保删除的.mdf和.LOG数据库文件。
  3. 进入包管理控制台。 回车enable-migrations -projectname yourprojectname
  4. 进入包管理控制台。 回车add-migration "Initial" -projectname yourprojectname
  5. 打开迁移配置文件和粘贴从步骤1到种子方法中复制的代码。
  6. 进入包管理控制台。 输入update-database -projectname yourprojectname

这应该做的伎俩。



Answer 5:

试图在旧的数据库版本迁移到一个新的模式,无论是数据库不匹配的新模式或我有这样的错误:

类型不解决会员 'Npgsql.PostgresException,Npgsql的,版本= 3.2.2.0,文化=中性公钥= 5d8b90d52f46fda7'

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

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

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

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

希望这可以帮助。



Answer 6:

你并不需要手动删除的迁移,以方便将其删除

Remove-Migration

那么你就可以再次重新迁移脚本Add-Migration

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

Drop-Database

然后,您可以Update-Database

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



文章来源: Entity Framework Code Migrations - Stuck on Initial Migration