c.String(n-6ren">
gpt4 book ai didi

entity-framework-5 - 无法从 PK 中删除身份属性

转载 作者:行者123 更新时间:2023-12-04 07:58:28 24 4
gpt4 key购买 nike

我需要将我的一个表上的主键的数据类型从 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。当以 native 生成的方式运行时,迁移导致 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");

最佳答案

至少对于某些版本的 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)
}

关于entity-framework-5 - 无法从 PK 中删除身份属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20153233/

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