.net Entity Framework Core中的非标准OneToOne关系问题

wkyowqbh  于 2023-03-24  发布在  .NET
关注(0)|答案(1)|浏览(150)

我有两张table:产品和外部产品。产品可以是外部产品,外部产品与产品相关。
尽管将外键从Product放到ExternalProduct是直观的,但这是对更复杂场景的最小复制,而这是不可能的。
因此ExternalProduct有一个指向Product的外键。此时Entity框架生成以下代码:
Product.cs:

public virtual ICollection<ExternalProduct> ExternalProduct { get; set; }

外部产品的EFMap:

builder.HasOne(d => d.Product)
            .WithMany(p => p.ExternalProduct)
            .HasForeignKey(d => d.ProductId)
            .OnDelete(DeleteBehavior.ClientSetNull)
            .HasConstraintName("ExternalProduct_Product_Id_fk");

这在技术上是正确的,因为EF,具有从ExternalProduct到Product的外键,认为这是一对多的关系,但是,在我的情况下,对于Product只有一个ExternalProduct。
如何修改配置以实现此目标?

yvgpqqbh

yvgpqqbh1#

两个实体之间要么有关系,要么没有关系。如果你在ProductExternalProduct之间有一对一的关系,那么你需要在关系的两边都有相应的列/属性。另一个选项是(零或一)对一,那么你可以在关系的(零或一)一边声明可空的属性:

class Product
{
    public virtual int? ExternalProductId { get; set; }
    public virtual ExternalProduct? ExternalProduct { get; set; }
}

此外,您还可以考虑使用EF Core中提供的inheritance hierarchy options
如果所有这些都不适合你(即很可能这里没有实际的关系)-然后删除双方的关系(并可能添加一些索引)。

相关问题