2

我将一个项目升级到 Entity Framework 4.3 并在项目上启用了迁移。

但是,在运行 Update-Database 命令时出现此错误:

无法构建下一次迁移,因为目标数据库是使用早于 EF 4.3 的 Code First 版本创建的,并且不包含迁移历史记录表。要开始对该数据库使用迁移,请确保当前模型与目标数据库兼容并执行迁移更新过程。(在 Visual Studio 中,您可以使用包管理器控制台中的 Update-Database 命令来执行迁移更新过程)。

基本上,它告诉我运行给我错误的相同命令(更新数据库)。

有任何想法吗?


不完全是一种“有趣”的方式,但我让应用程序创建一个新数据库,该数据库创建一个名为“__MigrationHistory”的系统表。然后我运行以下脚本在我的旧数据库上创建该表。我还创建了一个脚本,将新数据库中存在的一行复制到旧数据库中。

如果来自 Microsoft 或社区的人知道执行此操作的更有效方法,请在此处发布!


SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[__MigrationHistory](
    [MigrationId] [nvarchar](255) NOT NULL,
    [CreatedOn] [datetime] NOT NULL,
    [Model] [varbinary](max) NOT NULL,
    [ProductVersion] [nvarchar](32) NOT NULL,
 CONSTRAINT [PK___MigrationHistory] PRIMARY KEY CLUSTERED 
(
    [MigrationId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,         ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO
4

3 回答 3

3

当您运行Enable-Migrations时,脚本可能没有创建初始迁移,特别是如果您的模型与数据库不匹配,或者如果您的DbContext类是在不同的项目中定义的。

我不确定将迁移添加到现有 4.3 之前的数据库的“正确方法”是什么,但最简单的方法是转储数据库。把桌子放在里面...

确保 Migrations 文件夹中的配置文件具有正确的上下文类型,然后Add-Migration Initial. 将构建一个大类,代表您当前的模型。

现在Update-Database将毫无怨言地运行。


如果您在数据库中有您关心的数据,您可能能够作弊并将__MigrationHistory迁移过程创建的表添加到数据库的先前备份中。删除EdmMetadata和迁移不应该更明智。

希望真正知道如何将迁移添加到现有 EF Code First 数据库的人将有更顺畅的升级步骤?

于 2012-02-14T16:24:09.637 回答
1

我刚刚在我“认为”已经是 4.3 但不是....

我通过这篇博文找到了答案。

这是基本步骤。

  1. 不要对模型进行任何更改,真的,不要!
  2. 添加初始迁移。
  3. 更新数据库(全部)。

现在你可以开始你的正常业务了。

这是细节:

不要改变模型。

如果你有,你需要支持这些。乌格。我只是注释掉了我的更改。幸运的是,对我来说,变化仍然很小。当然,无论如何你都是在小块做事。:-)

添加初始迁移。

Add-Migration "InitialModel" -IgnoreChanges

在 up 脚本中添加以下内容:

public override void Up()    
{        
  Sql("DROP TABLE EdmMetadata");    
}

添加 drop table 不是必需的,但 4.3 及更高版本不要使用 EdmMetadata,所以也可以。

更新数据库(全部)

Update-Database

你有这个数据库的其他服务器吗?测试、分期、生产?一定要为他们所有人做这最后一步。您可以等到完成所有迁移工作后再对其他服务器执行此操作。

现在,照常继续。进行更改并按照正常Add-MigrationUpdate-Database步骤进行迁移。

于 2013-10-01T22:58:37.233 回答
1

感谢您的提问和回答。我已经完成了以下操作(上面的建议组合)。

如何使用数据和 Code First 模型从 pre-EF 4.3 迁移:

  1. 注释掉与当前数据相比所做的所有更改(我需要删除表添加)。
  2. 备份数据库
  3. 删除表格EdmMetadata
  4. __MigrationHistory使用上面的脚本添加表
  5. Add-Migration "InitialModel"
  6. 删除除该表之外的所有__MigrationHistory
  7. Update-database
  8. __MigrationHistory使用新添加的数据生成脚本。在那里添加Drop table EdmMetadata
  9. 恢复数据库并运行此脚本。
  10. 取回代码中的更改。
  11. Add-Migration YOURNAMEFORNEWCHANGES
  12. Update-Database

而且我有旧数据库,其中的数据已更新到 EF 6。希望对您有所帮助!

于 2014-01-30T14:20:36.220 回答