【问题标题】:Cant remove identity attribute from PK无法从 PK 中删除身份属性
【发布时间】:2013-11-22 19:43:55
【问题描述】:

我需要将我的一个表上的主键的数据类型从 int 更改为字符串(我没有说我想...)。迁移会生成这段代码:

AlterColumn("dbo.Venues", "ID", c => c.String(nullable: false, maxLength: 128));

这会导致 SQL 服务器抱怨数据类型必须是 int、bigint 等,因为该列是标识列。我添加了以下内容,但似乎没有效果:

AlterColumn("dbo.Venues", "ID", c => c.Int(identity:false));

问题:如何进行迁移以将数据类型从 int 更改为 string?

以下可能与我的问题有关,但不一定: 迁移生成的唯一代码是上面显示的第一个 AlterColumn。当以本机生成的方式运行时,迁移导致 SQL Server 抱怨它无法更改列,因为它存在依赖关系。事实上,唯一的依赖是它是一个 PK(没有将它作为 FK 引用的表)。我将迁移修改为如下所示,现在我收到如上所示的数据类型错误。

DropPrimaryKey("dbo.Venues");
AlterColumn("dbo.Venues", "ID", c => c.Int(identity:false));
AlterColumn("dbo.Venues", "ID", c => c.String(nullable: false, maxLength: 128));
AddPrimaryKey("dbo.Venues", "ID");

【问题讨论】:

    标签: entity-framework-5 entity-framework-migrations


    【解决方案1】:

    至少对于某些版本的 SQL Server,这可以在不删除/重新创建数据库的情况下完成。据报道,它不适用于 Azure(或截至 2015 年的评论)。受this answer 的启发,这是我的 Up() 方法。

    请注意,我在此表上没有任何外键,因此不需要支持链接答案中涵盖的皱纹

        public override void Up()
        {
            DropPrimaryKey("dbo.Products"); // Should be same as ALTER TABLE yourTable DROP CONSTRAINT PK_yourTable_id;
            Sql("alter table dbo.Products add tempId int NOT NULL default -1");
            Sql("update dbo.Products set tempId = Id;");
            // Won't work. Can't remove identity: AlterColumn("dbo.Products", "Id", c => c.Int(nullable: false));
            Sql("alter table dbo.Products drop column Id");
            Sql("EXEC sp_rename 'Products.tempId', 'Id', 'COLUMN'");
            AddPrimaryKey("dbo.Products", "Id"); // Should be same as ALTER TABLE yourTable ADD CONSTRAINT PK_yourTable_id PRIMARY KEY (id)
        }
    

    【讨论】:

    • 这对我来说就像一个魅力,让我不必放弃任何桌子。
    • 我想找到所有说这是不可能的帖子并链接到您的答案。谢谢!
    【解决方案2】:

    从列中删除标识规范只能通过重新创建表来完成。查看ALTER TABLE - ALTER COLUMN 语句:没有语法可以更改(添加或删除)身份规范。

    所以恐怕您必须手动执行此操作,并为后续迁移重新开始。

    顺便说一句,Sql Server Management Studio 不会帮助您执行此操作。您可能希望使用 Toad for Sql Server。当您删除身份规范时,它会创建一个完整的表重建脚本。

    【讨论】:

    • 添加了一个不需要重新创建表格的答案。
    猜你喜欢
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    • 2018-02-03
    • 2017-08-19
    相关资源
    最近更新 更多