EF Core同一实体映射另一实体两个字段的关系配置问题
实体关联问题解答
关联关系类型判定
两个实体属于一对多关联,且是同一主表(Currency)与从表(Product)之间的两条独立一对多关系:
- 站在Currency维度:1种货币可以被任意数量的产品设为批发货币,也可以被任意数量的产品设为零售货币
- 站在Product维度:1个产品只会关联1种批发货币、1种零售货币
不存在1种货币只能绑定1个产品的约束,因此不是一对一关系。
实体定义正确性说明与修正
你当前编写的Product实体字段结构符合ORM(EF/EF Core)的默认映射约定,但存在两处需要补全的点,否则可能出现关联映射错误、级联删除异常:
- Currency实体缺少对应两条关联关系的集合导航属性,需要补充:
public class Currency { /// <summary> /// Id is the 3 character ISO currency code /// </summary> [StringLength(3)] public string Id { get; set; } [StringLength(100)] public string Name { get; set; } // 对应使用该货币作为批发货币的产品集合 public virtual ICollection<Product> WholesaleUseProducts { get; set; } = new List<Product>(); // 对应使用该货币作为零售货币的产品集合 public virtual ICollection<Product> RetailUseProducts { get; set; } = new List<Product>(); }
- 由于Product有两个外键同时指向Currency表,默认约定配置可能无法正确匹配外键与导航属性的对应关系,建议在上下文配置中显式映射关联,同时关闭级联删除避免循环级联冲突:
protected override void OnModelCreating(ModelBuilder modelBuilder) { // 批发货币关联配置 modelBuilder.Entity<Product>() .HasOne(p => p.WholesaleCurrency) .WithMany(c => c.WholesaleUseProducts) .HasForeignKey(p => p.WholesaleCurrencyId) .OnDelete(DeleteBehavior.Restrict); // 零售货币关联配置 modelBuilder.Entity<Product>() .HasOne(p => p.RetailCurrency) .WithMany(c => c.RetailUseProducts) .HasForeignKey(p => p.RetailCurrencyId) .OnDelete(DeleteBehavior.Restrict); }
补全以上配置后,实体间的关联就能正常工作,你原本写的Product实体的外键字段、导航属性命名是符合规范的,不需要修改。
内容的提问来源于stack exchange,提问作者thampister
相关产品推荐
相关产品推荐

