Entity framework 在Azure上使用EntityFramework CodeFirst迁移更改PK数据类型时出现问题

Entity framework 在Azure上使用EntityFramework CodeFirst迁移更改PK数据类型时出现问题,entity-framework,azure,azure-sql-database,entity-framework-migrations,Entity Framework,Azure,Azure Sql Database,Entity Framework Migrations,我有一个托管在Azure上的代码优先EntityFramework项目。目前,我通过 从包管理器控制台运行添加迁移 从包管理器控制台运行updatedatabase-script获取.sql脚本 在我的开发环境上测试后,在Azure上手动运行脚本 到目前为止,这项工作进行得相当顺利。但是我在尝试将一个表的主键从int改为long时遇到了一些严重的问题 下面是从EntityFramework生成的迁移脚本 ALTER TABLE [ico].[AccountFeedbacks] ALTER COL

我有一个托管在Azure上的代码优先EntityFramework项目。目前,我通过

  • 从包管理器控制台运行添加迁移
  • 从包管理器控制台运行updatedatabase-script获取.sql脚本
  • 在我的开发环境上测试后,在Azure上手动运行脚本
  • 到目前为止,这项工作进行得相当顺利。但是我在尝试将一个表的主键从int改为long时遇到了一些严重的问题

    下面是从EntityFramework生成的迁移脚本

    ALTER TABLE [ico].[AccountFeedbacks] ALTER COLUMN [GameId] [bigint]
    ALTER TABLE [ico].[Games] ALTER COLUMN [Id] [bigint] NOT NULL
    ALTER TABLE [ico].[Accounts] ALTER COLUMN [LastWarningGameId] [bigint]
    ALTER TABLE [ico].[AccountGameRecords] ALTER COLUMN [GameId] [bigint] NOT NULL
    ALTER TABLE [ico].[GameFeedbacks] ALTER COLUMN [GameId] [bigint] NOT NULL
    
    --__MigrationHistory excluded
    
    由于索引和FK约束,运行此脚本根本无法工作。因此,首先我手动更改了脚本,如下所示:

    DROP INDEX [IX_GameId] ON [ico].[GameFeedbacks]
    DROP INDEX [IX_GameId] ON [ico].[AccountGameRecords]
    DROP INDEX [IX_GameId] ON [ico].[AccountFeedbacks]
    DROP INDEX [IX_LastWarningGameId] ON [ico].[Accounts]
    ALTER TABLE [ico].[AccountFeedbacks] DROP CONSTRAINT [FK_ico.AccountFeedbacks_ico.Games_GameId]
    ALTER TABLE [ico].[Accounts] DROP CONSTRAINT [FK_ico.Accounts_ico.Games_LastWarningGameId]
    ALTER TABLE [ico].[GameFeedbacks] DROP CONSTRAINT [FK_ico.GameFeedbacks_ico.Games_GameId]
    ALTER TABLE [ico].[AccountGameRecords] DROP CONSTRAINT [FK_ico.AccountGameRecords_ico.Games_GameId]
    ALTER TABLE [ico].[Games] DROP CONSTRAINT [PK_ico.Games]
    
    ALTER TABLE [ico].[AccountFeedbacks] ALTER COLUMN [GameId] [bigint]
    ALTER TABLE [ico].[Games] ALTER COLUMN [Id] [bigint] NOT NULL
    ALTER TABLE [ico].[Accounts] ALTER COLUMN [LastWarningGameId] [bigint]
    ALTER TABLE [ico].[AccountGameRecords] ALTER COLUMN [GameId] [bigint] NOT NULL
    ALTER TABLE [ico].[GameFeedbacks] ALTER COLUMN [GameId] [bigint] NOT NULL
    
    ALTER TABLE [ico].[Games] ADD CONSTRAINT [PK_ico.Games] PRIMARY KEY ([Id])
    ALTER TABLE [ico].[AccountGameRecords] ADD CONSTRAINT [FK_ico.AccountGameRecords_ico.Games_GameId] FOREIGN KEY ([GameId]) REFERENCES [ico].[Games] ([Id]) ON DELETE CASCADE
    ALTER TABLE [ico].[GameFeedbacks] ADD CONSTRAINT [FK_ico.GameFeedbacks_ico.Games_GameId] FOREIGN KEY ([GameId]) REFERENCES [ico].[Games] ([Id]) ON DELETE CASCADE
    ALTER TABLE [ico].[Accounts] ADD CONSTRAINT [FK_ico.Accounts_ico.Games_LastWarningGameId] FOREIGN KEY ([LastWarningGameId]) REFERENCES [ico].[Games] ([Id])
    ALTER TABLE [ico].[AccountFeedbacks] ADD CONSTRAINT [FK_ico.AccountFeedbacks_ico.Games_GameId] FOREIGN KEY ([GameId]) REFERENCES [ico].[Games] ([Id])
    CREATE INDEX [IX_LastWarningGameId] ON [ico].[Accounts]([LastWarningGameId])
    CREATE INDEX [IX_GameId] ON [ico].[AccountFeedbacks]([GameId])
    CREATE INDEX [IX_GameId] ON [ico].[AccountGameRecords]([GameId])
    CREATE INDEX [IX_GameId] ON [ico].[GameFeedbacks]([GameId])
    
    --__MigrationHistory excluded
    

    我不确定这是否是最好的解决方案。但它似乎在我的开发机器上工作。不幸的是,由于“此版本的SQL Server不支持没有聚集索引的表。请创建聚集索引并重试”,它将无法在Azure上工作。这是由于ALTER TABLE[ico].[Games]DROP约束[PK_ico.Games]造成的。有什么建议吗?

    对于Azure,我只是放弃了表(将其从我的上下文中删除),然后重新构建它。当然,只有当您能够承受丢失游戏表中的所有数据时,这才有效。对我来说,我决定在部署之前更改主键,因此我的表中只有测试数据。

    Azure SQL似乎不允许更改主键。