我已经通过的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。” - 它呢!
很沮丧!
我有同样的问题,使EF迁移的代码优先模式与现有的数据库,以及以下程序的工作:
- 在项目中删除现有的迁移文件夹,删除表
__MigrationHistory
从现有的数据库。 - 运行
enable-migrations
从包管理器控制台命令。 - 运行
add-migration
命令用来创建一个初始迁移。 - 除去所有的代码在
Up()
用于初始迁移方法。 - 运行
update-database
命令初始迁移应用到你的数据库。 这不会对现有对象的任何变化(因为Up()
方法不包含任何代码),但它标志着现有的数据库为已迁移到初始状态。 - 修改您的代码,第一个模型。
- 运行该
add-migration
命令来创建新的迁移。 在代码Up()
新移民的方法将只包含更改的对象模型。 - 运行
update-database
命令将更改应用到数据库。
我跑更新,数据库,并再次得到同样的错误。 我尝试“更新,数据库-TargetMigration 201304080859556_MyMigration - 强制”,但这种生产“指定目标的迁移‘201304080859556_MyMigration’不存在,确保目标的迁移是指现有的移民ID。” - 它呢!
还有一个问题,它可能会导致你的最后一个错误(也许是以前的的根本原因)。 我有一个类似的问题,事实证明,一些奇怪的原因我的一些移民类的,其中在不同的命名空间比我的命名空间MigrationConfiguration
类。 更正命名空间(也xxx.Designer.cs
文件)解决了这个问题(迁移是可见和工作再次)。
你有没有尝试使用强制参数应用更改。
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迁移
试图在旧的数据库版本迁移到一个新的模式,无论是数据库不匹配的新模式或我有这样的错误:
类型不解决会员 'Npgsql.PostgresException,Npgsql的,版本= 3.2.2.0,文化=中性公钥= 5d8b90d52f46fda7'
下面是它如何工作(使用自动迁移):
- 删除文件夹迁移
- 执行所启用的迁移
坐落在新创建的Configuration.cs这两个属性为true
public Configuration() { AutomaticMigrationsEnabled = true; AutomaticMigrationDataLossAllowed = true; }
执行更新,数据库-Force
您的数据库将更新到最新的计划和准备。
希望这可以帮助。
你并不需要手动删除的迁移,以方便将其删除
Remove-Migration
那么你就可以再次重新迁移脚本Add-Migration
。
在您的情况,更新数据库失败,因为现有的表,把它们用
Drop-Database
然后,您可以Update-Database
。
这些命令的更详细的用法是在这里 。