OwnsOne удаляет IDENTITY из таблицы ключей - PullRequest
3 голосов
/ 12 марта 2020

Я создал объект заказа, и сейчас у меня есть тип Money, который я хочу включить в свой объект Order как собственный тип.

public class Money
{
    public decimal Value { get; set; }

    public Currency Currency { get; set; }
}

, и мой класс Order выглядит следующим образом

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 $$;

Кто-нибудь знает, почему добавление типа Owned в Entity Framework и postgresql базе данных вызывает такое поведение и как я могу убедиться, что поле ключа не будет изменено?

  • PostgreSQL 11.7
  • Microsoft.AspNetCore.App 3.1.2
  • Microsoft.NETCore.App 3.1.2
  • Microsoft.EntityFrameworkCore.Design Версия = 3.1 .1
  • Npg sql .EntityFrameworkCore. PostgreSQL Версия = 3.1.2

1 Ответ

0 голосов
/ 29 марта 2020

Это ошибка в провайдере Npg sql EF Core, см. https://github.com/npgsql/efcore.pg/issues/1324. Исправление будет объединено для 3.1.4.

...