gpt4 book ai didi

entity-framework - 在 Azure 上使用 Entity Framework Code First 迁移更改 PK 数据类型时出现问题

转载 作者:行者123 更新时间:2023-12-03 03:17:02 26 4
gpt4 key购买 nike

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

处理迁移
  1. 从程序包管理器控制台运行添加迁移
  2. 从程序包管理器控制台运行 Update-Database -script 获取 .sql 脚本
  3. 在我的开发环境中测试后在 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

由于 INDEX 和 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

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

最佳答案

使用 Azure,我最终只是删除了该表(将其从我的上下文中删除),然后重新搭建了它的脚手架。当然,只有当您有能力丢失 Games 表中的所有数据时,这才有效。对我来说,我决定在部署之前更改主键,因此我的表中只有测试数据。

关于entity-framework - 在 Azure 上使用 Entity Framework Code First 迁移更改 PK 数据类型时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23432187/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com