【问题标题】:Code First and Existing Database with Data代码优先和现有数据库与数据
【发布时间】:2017-01-14 17:40:31
【问题描述】:

我正在开发一个使用 SQL Server 数据库的 Windows 应用程序。我有这个应用程序的不同版本,它们有不同的数据库结构,所以我需要在应用程序启动时将数据库迁移到最新版本。我想将数据库结构与应用程序模型进行比较,然后执行更改、创建或删除命令。

我还想使用 EF Code-First ORM,经过一番搜索,我发现代码中有一些有用的命令和配置。但问题是,据我所知,它们都删除了现有数据库并创建了一个新数据库,因此在我需要数据时数据会丢失。

我在我的应用程序启动函数中使用了这些行:

var migrator = new DbMigrator(new Configuration());
migrator.Update();

但是在执行这一行之后我会得到这个异常:

There is already an object named 'SomeTable' in the database.

我知道,没错,有那个表,但结构发生了变化!我如何比较结构并完成其余的工作?

【问题讨论】:

    标签: ef-code-first database-migration entity-framework-migrations


    【解决方案1】:

    这不是how migrations work. 您需要为数据库的每个版本进行迁移,以便 EF 可以检查 __MigrationHistory 表并查看它是否已应用。如果您的初始化程序设置为MigrateDatabaseToLatestVersion,您的数据库将不会在模型更改时重新创建。

    您可以尝试重新创建历史记录:回滚到最旧的数据库、添加迁移、添加第二个最旧的版本更改、创建第二个迁移等。

    另一种选择是为您现在所在的位置添加迁移,生成脚本(更新数据库-脚本),然后在应用之前注释掉每个已部署数据库中存在的内容。

    另一种选择是对每个数据库和您当前的数据库使用VS Schema compare utility 来完成更改。然后对每个应用基线迁移(add-migration Initial -IgnoreChanges)。

    现在,您可以生成一系列迁移,并且您的代码应该可以按预期工作。

    【讨论】:

      猜你喜欢
      • 2012-04-27
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-23
      • 1970-01-01
      相关资源
      最近更新 更多