首页 > 解决方案 > 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 类型会导致这种行为,我如何确保不会更改键字段?

标签: c#postgresql.net-coreentity-framework-corenpgsql

解决方案


这是 Npgsql EF Core 提供程序中的一个错误,请参阅https://github.com/npgsql/efcore.pg/issues/1324。将合并 3.1.4 的修复程序。


推荐阅读