EF Core:如何使拥有的集合成为必需?

问题描述 投票:0回答:1

我有以下实体:

public class Cart
{
    public required Guid Id { get; init; }
    public required List<CartProduct> Products { get; init; }
}

public class CartProduct
{
    public required Guid ProductId { get; init; }
    public required int Quantity { get; set; }
}

我正在配置

Cart
实体,如下所示:

public class CartEntityTypeConfiguration : IEntityTypeConfiguration<Cart>
{
    public void Configure(EntityTypeBuilder<Cart> cartEntity)
    {
        cartEntity.ToTable("carts");

        cartEntity
            .HasKey(cart => cart.Id)
            .HasName("pk_carts");

        cartEntity
            .Property(cart => cart.Id)
            .HasColumnName("id");

        cartEntity.OwnsMany(
            cart => cart.Products,
            products => products.ToJson("products")
        );
    }
}

但它会导致

"products"
属性被视为可为空。

这是生成的迁移的代码片段:

migrationBuilder.CreateTable(
    name: "carts",
    columns: table => new
    {
        id = table.Column<Guid>(type: "uuid", nullable: false),
        products = table.Column<string>(type: "jsonb", nullable: true)
    },
    constraints: table =>
    {
        table.PrimaryKey("pk_carts", x => x.id);
    }
);

请注意

products
列如何标有
nullable: true

我尝试了以下两种选择:

cartEntity.OwnsMany(
    cart => cart.Products,
    products => products.ToJson("products")
);

cartEntity
    .Navigation(cart => cart.Products)
    .IsRequired();

cartEntity
    .OwnsMany(
        cart => cart.Products,
        products => products.ToJson("products")
    )
    .Navigation(cart => cart.Products)
    .IsRequired();

但是使用这两种方法我都遇到了相同的错误:

无法创建类型为“”的“DbContext”。异常“Cart.Products”无法根据需要进行配置,因为它被配置为集合。尝试创建实例时抛出。有关设计时支持的不同模式,请参阅 https://go.microsoft.com/fwlink/?linkid=851728

有没有办法让这个属性不可为空?

PS:是的,我可以直接编辑生成的迁移,但我希望有一种方法可以使用 Fluent API 来配置它。

c# postgresql entity-framework-core
1个回答
0
投票

我不认为可以根据需要配置拥有的集合。请务必使用默认值声明您拥有的集合:

public List<Entity> Entities { get; set; } = [];

这样如果数据库中存储了null(例如通过在迁移中添加字段),当您通过EF core选择它时,它将是一个空白集合而不是null。

其原因与“必需集合”的概念有关,除了通过业务逻辑之外,在关系数据库中无法强制执行。虽然理论上可以强制执行拥有的集合的可为空性似乎是可行的,但 EF 核心不支持它。

© www.soinside.com 2019 - 2024. All rights reserved.