我们的部分自动构建过程涉及运行migrate.exe以将测试数据库更新到最新版本的数据库。
这个过程相对简单:
第二步(显然是编辑)的一个例子是:
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)。有趣的是,当指向不同的数据库时,它的发生方式完全相同。
答案 0 :(得分:1)
我认为我有解决方案,我遇到了同样的问题。结果证明是SQL权限问题。 构建服务器服务用户需要读/写和ddladmin权限才能使迁移工作。 在我的情况下,dba仅将服务用户的权限更改为ddladmin,但迁移过程需要读取和写入迁移历史记录表。 由于无法读取迁移历史记录,因此假定它需要应用所有迁移。 这是我的帐户和构建服务帐户之间的不同权限。 希望这有助于某人。