在构建服务器上,migrate.exe希望通过迁移“重新开始”

时间:2016-02-10 21:22:04

标签: c# entity-framework ef-migrations

我们的部分自动构建过程涉及运行migrate.exe以将测试数据库更新到最新版本的数据库。

这个过程相对简单:

  1. 将migrate.exe复制到正在编译的项目的/ bin文件夹
  2. 使用连接字符串(指定为构建定义的一部分)执行migrate.exe。
  3. 第二步(显然是编辑)的一个例子是:

    migrate.exe Company.Data.dll /connectionString="Server=...;Database=...;User Id=...;Password=..." 
                                 /connectionProviderName="System.Data.SqlClient"
    

    其中Company.Data.dll是在构建服务器上编译的项目的刚构建输出。

    这个过程已经存在了几个月,并且一直很好。直到今天。

    今天,当上面的命令运行时,migrate.exe会尝试运行所有迁移 - 从头开始​​ - 而不仅仅是添加的新迁移。这显然会失败,因为它尝试创建数据库中已存在的表。是否存在实际挂起的迁移,会出现问题。

    我已经确认日志文件中显示的连接字符串所指向的数据库是正确的,并且它具有__MigrationHistory表中的所有相应条目,这些条目应该导致迁移只输入缺少的内容。

    如果我从源代码控制中下载代码,构建它并在本地运行migrate.exe(使用相同的连接字符串)它会正常运行(最初只运行应该进行的迁移,然后在后续尝试中说没有待处理的显式迁移)。

    在我看来,只要连接字符串指向正确的数据库并且用于EF的DbContext派生类的名称与__MigrationHistory表中的名称匹配,migrate.exe应该能够找到条目,而不是运行这些迁移。

    我还缺少什么我应该看看?

    更新 当我指向同一台服务器上的不同数据库时,我才发生这种情况。相同的“解决方法”(在本地运行migrate.exe)。有趣的是,当指向不同的数据库时,它的发生方式完全相同。

1 个答案:

答案 0 :(得分:1)

我认为我有解决方案,我遇到了同样的问题。结果证明是SQL权限问题。 构建服务器服务用户需要读/写和ddladmin权限才能使迁移工作。 在我的情况下,dba仅将服务用户的权限更改为ddladmin,但迁移过程需要读取和写入迁移历史记录表。 由于无法读取迁移历史记录,因此假定它需要应用所有迁移。 这是我的帐户和构建服务帐户之间的不同权限。 希望这有助于某人。