我已通过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” - 确实如此!
非常令人沮丧!
答案 0 :(得分:22)
我在使用现有数据库的代码优先模型启用EF迁移时遇到了同样的问题,并且以下过程有效:
__MigrationHistory
。enable-migrations
命令。add-migration
命令以创建初始迁移。Up()
方法中的所有代码以进行初始迁移。update-database
命令将初始迁移应用于数据库。
这不会对现有对象进行任何更改(因为Up()
方法不包含代码),但它将现有数据库标记为已迁移到初始状态。add-migration
命令以创建新的迁移。
新迁移的Up()
方法中的代码仅包含对象模型的更改。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)
这是一种通常有效的一揽子方法:
enable-migrations -projectname yourprojectname
add-migration "Initial" -projectname yourprojectname
。update-database -projectname yourprojectname
这应该可以解决问题。
答案 4 :(得分:0)
尝试将旧的db版本迁移到新模型,要么数据库与新模型不匹配,要么出现如下错误:
没有为成员解析类型&#39; Npgsql.PostgresException,Npgsql, Version = 3.2.2.0,Culture = neutral,PublicKeyToken = 5d8b90d52f46fda7&#39;
以下是它的工作原理(使用自动迁移):
在新创建的Configuration.cs中将这两个属性设置为true
public Configuration()
{
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = true;
}
执行Update-Database -Force
您的数据库将更新为最新方案并准备就绪。
希望这会有所帮助。
答案 5 :(得分:0)
您无需手动删除迁移,只需使用
即可轻松删除Remove-Migration
然后您可以使用Add-Migration
重新创建迁移脚本。
在您的情况下,由于存在现有表,因此更新数据库失败
Drop-Database
然后您可以Update-Database
。
这些命令的更详细用法是here。
答案 6 :(得分:0)
1)删除项目中现有的Migrations文件夹,然后从Migration_History表中删除现有的迁移(如果有)。
2)从程序包管理器控制台中运行以下命令:
添加迁移重置
3)之后,从程序包管理器控制台中运行以下命令:
删除迁移
4)之后,从程序包管理器控制台中运行以下命令(InitialMigration是第一个迁移的名称,您可以根据需要命名):
添加迁移InitialMigration