Я создал объект заказа, и сейчас у меня есть тип 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