C# 如何使用EF迁移更改主键和外键的数据类型?

C# 如何使用EF迁移更改主键和外键的数据类型?,c#,sql-server,entity-framework-6,C#,Sql Server,Entity Framework 6,我必须将现有数据库/表中使用的所有主键和外键的数据类型从int更改为bigint 要解决以下错误 Msg 5074,第16级,第8状态,第1行 对象“主键约束名称”依赖于列“主键列名”。 ALTER TABLE ALTER COLUMN Name失败,因为一个或多个对象访问此列 我首先必须删除约束,然后稍后重新创建它。这是我使用SSMS的方式: alter table Meta.Playground drop constraint Pk_Playground go alter table Me

我必须将现有数据库/表中使用的所有主键和外键的数据类型从
int
更改为
bigint

要解决以下错误

Msg 5074,第16级,第8状态,第1行
对象“主键约束名称”依赖于列“主键列名”。
ALTER TABLE ALTER COLUMN Name失败,因为一个或多个对象访问此列

我首先必须删除约束,然后稍后重新创建它。这是我使用SSMS的方式:

alter table Meta.Playground
drop constraint Pk_Playground
go

alter table Meta.Playground
alter column id bigint not null
go

alter table Meta.Playground
add constraint Pk_Playground primary key (id)
go
但是,使用实体框架的
Up()
Down()方法实现这一点的最佳方法是什么

我不知道如何从这些方法中检索键和约束名称

通过使用SQL,我将按如下方式检索它们:

select COLUMN_NAME, CONSTRAINT_NAME 
into #result
from INFORMATION_SCHEMA.KEY_COLUMN_USAGE
where TABLE_NAME = @table and TABLE_SCHEMA = @schema

对于EF迁移中的约束,您需要直接执行SQL语句。您可以使用Sql函数来实现这一点

例如:

public override void Up()
{
    Sql("ALTER TABLE Meta.Playground DROP CONSTRAINT Pk_Playground");
}
为了支持约束的动态名称,您需要传入一个SQL语句,该语句获取名称,然后执行ALTER语句

这里有一个例子:


这就是您通过Sql函数传递的语句。

我意识到,我试图解决这个问题的方法是复杂化

添加一个额外的迁移步骤以一种令人惊讶的简单方式解决了我的问题。因此不需要额外的SQL脚本。Entity framework完全能够迁移主键和外键(至少我使用的是6.1.3版)

这是使用适当的参数调用
Add Migration
后的代码

public override void Up()
{
    DropForeignKey(...)
    // ...
    DropIndex(...) 
    // ... 
    DropPrimaryKey(...)
    // ...
    AlterColumn(...)
    // ...
    AddPrimaryKey(...)
    // ...
    CreateIndex(...)
    // ...
    AddForeignKey) 
    // ...
}

请记住,除了删除并重新创建主键外,您还需要删除并重新创建引用此类表的所有外键。用于回复的Thx。为了完整性:这同样适用于索引。
public override void Up()
{
    DropForeignKey(...)
    // ...
    DropIndex(...) 
    // ... 
    DropPrimaryKey(...)
    // ...
    AlterColumn(...)
    // ...
    AddPrimaryKey(...)
    // ...
    CreateIndex(...)
    // ...
    AddForeignKey) 
    // ...
}