c# - OwnersOne 从表键中删除 IDENTITY
问题描述
我创建了一个订单实体,现在我有一个 Money 类型,我想将它作为 Own 类型包含在我的 Order 实体中。
public class Money
{
public decimal Value { get; set; }
public Currency Currency { get; set; }
}
我的订单类如下
public class Order
{
[Key]
public long OrderId { get; set; }
}
现在我想向订单实体添加一种货币类型,如下所示:
public class Order
{
[Key]
public long OrderId { get; set; }
public Money Amount { get; set; }
}
OrderContext 如下所示:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Order>().OwnsOne(o => o.Amount);
}
当我运行实体框架迁移时会出现问题。这是我运行迁移后得到的:
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AlterColumn<long>(
name: "OrderId",
table: "Order",
nullable: false,
oldClrType: typeof(long),
oldType: "bigint")
.OldAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
migrationBuilder.AddColumn<int>(
name: "Amount_Currency",
table: "Order",
nullable: true);
migrationBuilder.AddColumn<decimal>(
name: "Amount_Value",
table: "Order",
nullable: true);
}
正如您所看到的,出于某种原因,使用 OwnOne 会更改我的 OrderId 列,并且当我检查生成的 sql 时,它看起来像是从中删除了 IDENTITY。
BEGIN
IF NOT EXISTS(SELECT 1 FROM "__EFMigrationsHistory" WHERE "MigrationId" = '20200311224448_1.0.108-g5d3eec73db-Order') THEN
ALTER TABLE `Order` ALTER COLUMN "OrderId" TYPE bigint;
ALTER TABLE `Order` ALTER COLUMN "OrderId" SET NOT NULL;
ALTER TABLE `Order` ALTER COLUMN "OrderId" DROP IDENTITY;
ALTER TABLE `Order` ALTER COLUMN "OrderId" DROP DEFAULT;
END IF;
END $$;
DO $$
BEGIN
IF NOT EXISTS(SELECT 1 FROM "__EFMigrationsHistory" WHERE "MigrationId" = '20200311224448_1.0.108-g5d3eec73db-Order') THEN
ALTER TABLE `Order` ADD "Amount_Currency" integer NULL;
END IF;
END $$;
DO $$
BEGIN
IF NOT EXISTS(SELECT 1 FROM "__EFMigrationsHistory" WHERE "MigrationId" = '20200311224448_1.0.108-g5d3eec73db-Order') THEN
ALTER TABLE `Order` ADD "Amount_Value" numeric NULL;
END IF;
END $$;
有谁知道为什么在 Entity Framework 和 postgresql 数据库中添加 Owned 类型会导致这种行为,我如何确保不会更改键字段?
- PostgreSQL 11.7
- Microsoft.AspNetCore.App 3.1.2
- Microsoft.NETCore.App 3.1.2
- Microsoft.EntityFrameworkCore.Design 版本=3.1.1
- Npgsql.EntityFrameworkCore.PostgreSQL 版本=3.1.2
解决方案
这是 Npgsql EF Core 提供程序中的一个错误,请参阅https://github.com/npgsql/efcore.pg/issues/1324。将合并 3.1.4 的修复程序。
推荐阅读
- redis - 如何防止Redis流内存无限增加?
- python - AttributeError:“请求”对象没有属性“订单数据”
- apache - htaccess https重定向不使用我最新的css文件?- http 和 https 版本的站点使用不同的 css
- android - Ticks64() 在 FMX (Android) 上返回 0
- c# - 无法加载文件或程序集“System.Runtime,版本=4.2.1.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a”
- java - 如何解决这个错误{Failed to start component [Connector[HTTP/1.1-8080]]}?
- excel - 从查询输出数据到 Excel:无法处理 Excel 中的数据
- kotlin - Kotlin 伴随对象意外结果
- angular - mat-table 中的 Colspan 和 rowspan
- javascript - 如何找到第一个 li 元素