C# 无法使用现有数据库运行EF5迁移

C# 无法使用现有数据库运行EF5迁移,c#,.net,entity-framework-5,entity-framework-migrations,ef-database-first,C#,.net,Entity Framework 5,Entity Framework Migrations,Ef Database First,首先,我阅读了以下问题/答案: 这些似乎都是EF5之前的EF版本,我的情况似乎不符合这些答案。那么,让我描述一下我的情况 我的应用程序最初是使用EF4创建的,模型优先。我用GUI设计器设计了我的数据库,并用它来生成我的数据库 几个月来,我一直在运行数据库并收集数据。我真的不能丢失这些数据 我对代码进行了分支,用NuGet安装了EF5,并使用EF Power Tools从数据库中生成模型,方法是右键单击一个新的类库项目,然后选择Entity Framework |逆向工程代码优先 我能够

首先,我阅读了以下问题/答案:

这些似乎都是EF5之前的EF版本,我的情况似乎不符合这些答案。那么,让我描述一下我的情况

  • 我的应用程序最初是使用EF4创建的,模型优先。我用GUI设计器设计了我的数据库,并用它来生成我的数据库
  • 几个月来,我一直在运行数据库并收集数据。我真的不能丢失这些数据
  • 我对代码进行了分支,用NuGet安装了EF5,并使用EF Power Tools从数据库中生成模型,方法是右键单击一个新的类库项目,然后选择
    Entity Framework |逆向工程代码优先
  • 我能够顺利地重新引用我的新项目,将我的项目转换为使用新的DbContext而不是ObjectContext,并删除了保存旧模型的EF4类库。这个节目效果很好 现在,我想尝试自动迁移,我在RubyonRails中有过一点经验。以下是我所做的:

  • 运行
    启用迁移
    。由于连接字符串和正在使用的app.config,出现了一些问题,但最终得到了它。但是,他说,这应该自动生成第一次迁移,让我达到我已经达到的程度。没有
  • 运行
    addmigrationinitialschema
    ,以完成步骤1中未自动完成的操作。这起作用了
  • 向我的一个模型对象添加了属性,然后尝试运行
    Add Migration AddSerialToLogEntries
    ,结果显示:
  • 由于以下原因,无法生成显式迁移 显式迁移挂起:[201307190100268_InitialSchema]。 在尝试生成迁移之前应用挂起的显式迁移 新的显式迁移

    尝试在现有数据库上应用迁移失败,这并不奇怪

    我上面提到的其他答案基本上是说我运气不好,但就像我说的,这些都是针对实体框架的旧版本的。我这里有什么选择吗

    在写这个问题时,我想我可以使用SQL Server Management Studio将我的数据导出到SQL脚本中,删除整个数据库,让EF创建它,然后运行脚本将我的数据返回到。。。我会在明天有时间的时候尝试,但我想知道是否还有其他选择,因为我不是100%确定这会起作用,并且不希望在过程中插入任何数据错误

    运行并启用迁移。由于连接字符串出现了一些问题 哪一个app.config被使用,但最终得到了它。然而, 这个MSDN页面说,这应该自动生成 第一次迁移让我达到我已经达到的程度。没有

    运行添加迁移InitialSchema以完成未完成的任务 在步骤1中自动完成。这起作用了

    事实上,
    enable migrations
    命令仅在您的数据库之前已使用code First创建时才创建初始迁移,在这种情况下,数据库包含一个
    \u MigrationHistory
    表。如果此表不存在(这种情况下,您的现有数据库以前从未使用Code First创建过)启用迁移仅创建配置类。您必须手动调用
    addmigration
    ,然后才能创建第一个迁移类。因此,您所看到的行为是预期的

    通常,如果使用EF 5,为迁移准备现有数据库的过程如下:

    • 在package manager控制台中调用
      启用迁移
      。将在项目中创建一个
      Migrations
      文件夹和一个
      Configuration

    • 打开
      Configuration
      类,并在构造函数中设置
      AutomaticMigrationsEnabled=false
      (如果默认情况下尚未设置)

    • 包内管理器控制台调用

      add-migration -IgnoreChanges InitialSchema
      
      “InitialSchema”只是一个示例名称。你可以随意命名。将创建一个从
      DbMigration
      派生的
      \u InitialSchema
      类。由于
      -IgnoreChanges
      标志,此类中的
      Up
      Down
      方法为空。如果没有此标志,该类将包含一个迁移,以将整个模型添加到数据库中,这不是您想要的,因为现有数据库已经包含数据库架构

    • 在package manager控制台中运行
      update database
      。由于
      Up
      方法为空,此更新不会对现有架构执行任何操作,只会创建
      \uu MigrationHistory
      表(作为数据库中的系统表),并将第一条记录添加到此表中,该表包含当前EF模型的模型哈希

    • 可选的最后一步:如果您喜欢使用自动迁移,请打开
      配置
      类,并在构造函数中设置
      AutomaticMigrationsEnabled=true
      。如果要继续基于代码的迁移,请保留标志
      false


    此时,您可以开始对模型进行更改。每次使用
    add migration
    创建新的迁移时,它都将基于修改前的模型,并且迁移类将只包含必要的架构更改。

    我建议使用稍微不同的方法,使您处于一种状态,您可以使用迁移从零开始在数据库中创建数据库发展环境:

  • 而不是调用
    添加迁移-IgnoreChanges InitialSchema
    , 尝试使初始模式迁移的生成工作正常。 正如您所说,这应该在您最初调用时发生
    启用迁移
    。你可以试试p
    var migrator = new DbMigrator(new Configuration());
    migrator.Update();