使用EF 4.3运行Update-Database时出错

时间:2012-02-14 15:36:23

标签: entity-framework entity-framework-4 ef-migrations

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

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

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

基本上,它告诉我运行给出错误的相同命令(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

3 个答案:

答案 0 :(得分:3)

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

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

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

现在Update-Database无怨无悔地运行。


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

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

答案 1 :(得分:0)

我刚刚在一个数据库中遇到过这个问题,我“认为”已经是4.3但不是......

我找到了blog post的答案。

这是基本步骤。

  1. 不要对模型进行任何更改,真的,不要!
  2. 添加初始迁移。
  3. 更新数据库(所有这些)。
  4. 现在你可以开始正常的生意了。

    这是细节:

    请勿更改模型。

    如果有,你需要支持这些。 UGGGG。我只是评论了我的变化。幸运的是,对我来说,变化仍然相当小。当然,无论如何,你正在以小块的方式做事。 : - )

    添加初始迁移。

    Add-Migration "InitialModel" -IgnoreChanges
    

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

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

    添加删除表不是必需的,但4.3及以上不要使用EdmMetadata,也可以。

    更新数据库(所有这些)

    Update-Database
    

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

    现在,继续正常。进行更改并遵循正常的Add-Migration& Update-Database迁移步骤。

答案 2 :(得分:0)

感谢您提出问题和答案。我做了以下(上面的建议组合)。

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

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