我有以下实体:
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 来配置它。
我不认为可以根据需要配置拥有的集合。请务必使用默认值声明您拥有的集合:
public List<Entity> Entities { get; set; } = [];
这样如果数据库中存储了null(例如通过在迁移中添加字段),当您通过EF core选择它时,它将是一个空白集合而不是null。
其原因与“必需集合”的概念有关,除了通过业务逻辑之外,在关系数据库中无法强制执行。虽然理论上可以强制执行拥有的集合的可为空性似乎是可行的,但 EF 核心不支持它。