c# - 如何使用 EF Core 将单个主键更改为复合主键
问题描述
我想删除已创建且不包含数据的 SQL 表中的单个主键 Id 列,并改为定义复合主键。
我当前的实体定义如下:
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public long IpFrom { get; set; }
public long IpTo { get; set; }
...
我想更新到这个:
[Key, Column(Order = 0)]
public long IpFrom { get; set; }
[Key, Column(Order = 1)]
public long IpTo { get; set; }
...
我已经使用 fluent api 进行了以下定义:
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<IPv4LocationEntity>()
.HasKey(b => new {b.IpFrom, b.IpTo})
.HasName("PK_TableName");
}
然后我使用 EF Tool 创建迁移文件并得到以下迁移文件。
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropPrimaryKey(
name: "PK_TableName",
table: "TableName");
migrationBuilder.DropColumn(
name: "Id",
table: "TableName");
migrationBuilder.AddPrimaryKey(
name: "PK_TableName",
table: "TableName",
columns: new[] { "IpFrom", "IpTo" });
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropPrimaryKey(
name: "PK_TableName",
table: "TableName");
migrationBuilder.AddColumn<int>(
name: "Id",
table: "TableName",
type: "int",
nullable: false,
defaultValue: 0)
.Annotation("SqlServer:Identity", "1, 1");
migrationBuilder.AddPrimaryKey(
name: "PK_TableName",
table: "TableName",
column: "Id");
}
}
当我想使用 EF 工具更新数据库时,我收到以下错误,即使一切对我来说似乎都是正确的:
ALTER TABLE DROP COLUMN failed because column 'Id' does not exist in table 'TableName'.
谢谢你的帮助。
解决方案
我试过这个并且运行dotnet ef database update
不应用迁移。
相反,从迁移中生成 SQL 文件并执行 SQL 查询。尝试这样做。
cd ToYourDbModelProject
dotnet ef --startup-project ../PathToStartupProject/ migrations script previous_migration current_migration -o current_migration.sql --context Namespace.To.Your.DbContext
推荐阅读
- clojure - YeSQL:哪个键需要值?
- java - 单击按钮时如何更改按钮颜色
- php - 连接时使用列作为表名
- excel - Outlook VBA 代码未退出
- javascript - Javascript - 过滤偶数
- twig - 带有 Symfony 4 插件的 PhpStorm 中缺少 Twig 模板
- css - 在伪选择器中使用 CSS 变量
- android - 按钮错误 Android Firebase
- api - Google Vision Api 支持 PDF 和 TIFF 文本检测,但它也可以与包含图像的 PDf 一起使用吗?
- ios - 滚动浏览数千张图片时,PHImageManager 的 requestImage 会锁定 UI