我已经创建了一个订单实体,现在我有一个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 $$;
有人知道为什么在Entity Framework和postgresql数据库中添加自有类型会导致此行为,并且如何确保键字段不会被更改?
这是Npgsql EF Core提供程序中的错误,请参阅https://github.com/npgsql/efcore.pg/issues/1324。修复程序将合并为3.1.4。