【问题标题】:Error when running Update-Database with EF 4.3使用 EF 4.3 运行更新数据库时出错
【发布时间】:2014-01-30 22:20:36
【问题描述】:

我将一个项目升级到 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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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


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

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

    【讨论】:

    • 谢谢!我想我将继续创建 _MigrationHistory 表,因为数据库中有很多需要使用的数据。
    • II 有类似的问题,我也需要保留数据。但是,当尝试通过编辑模型和“添加迁移新列”来添加列时,创建的迁移想要删除所有内容并重新开始。解决方案是在编辑任何内容之前添加初始迁移,这会导致迁移类具有空的向上/向下方法。然后我编辑了我的模型并运行了另一个 Add-Migration,它创建了一个新的迁移类,其中包含我需要的更改。不丢任何东西。
    【解决方案2】:

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

    的数据库上遇到了这个问题

    我通过 blog post 找到了答案。

    这是基本步骤。

    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 步骤进行迁移。

    【讨论】:

      【解决方案3】:

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

      如何使用 data 和 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-02-27
        • 2023-01-30
        • 2018-10-10
        • 1970-01-01
        • 2011-09-12
        • 2013-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多