Entity Framework Core不使用集合能否实现一对多关系?
错误原因
你当前配置报错的核心问题有3个:
- 单个导航属性不能同时关联两个关系:你让Side类的
Glass导航属性同时绑定了Glass.LeftSide和Glass.RightSide两个完全独立的关联,EF Core 不支持单个导航属性参与多个关系。 - 实体类存在语法错误:Side类中重复定义了同名的
Glass成员(int类型字段和Glass导航属性重名),本身无法通过编译。 - 配置存在拼写错误:
DeleteBehaviour为英式拼写,EF Core 官方枚举为美式拼写DeleteBehavior,会引发编译错误。
实现方案(无需集合)
EF Core 完全支持不用集合实现该类关系,你可以根据业务需求选择以下两种方案:
方案1:Side不保留反向导航(最简洁)
如果不需要从Side实例反向查询所属的Glass,直接删除Side类中多余的Glass相关成员即可:
public class Side { public int Id {get;set;} public string Value {get;set;} }
Fluent API 从Glass端配置关联:
modelBuilder.Entity<Glass>(entity => { // 配置左侧关联 entity.HasOne(glass => glass.LeftSide) .WithOne() // 无反向导航则留空 .HasForeignKey<Glass>(glass => glass.LeftSideId) .OnDelete(DeleteBehavior.ClientSetNull); // 配置右侧关联 entity.HasOne(glass => glass.RightSide) .WithOne() .HasForeignKey<Glass>(glass => glass.RightSideId) .OnDelete(DeleteBehavior.ClientSetNull); });
方案2:Side保留分场景反向导航(无集合)
如果需要从Side实例判断自己属于Glass的左侧还是右侧,可以在Side类中添加两个独立的反向导航:
public class Glass { public int Id {get;set;} public int? LeftSideId {get;set;} public Side LeftSide {get;set;} public int? RightSideId {get;set;} public Side RightSide {get;set;} } public class Side { public int Id {get;set;} public string Value {get;set;} // 两个独立的反向导航分别对应左右侧关联 public Glass? LeftOfGlass {get;set;} public Glass? RightOfGlass {get;set;} }
Fluent API 配置对应关联:
modelBuilder.Entity<Glass>(entity => { entity.HasOne(glass => glass.LeftSide) .WithOne(side => side.LeftOfGlass) .HasForeignKey<Glass>(glass => glass.LeftSideId) .OnDelete(DeleteBehavior.ClientSetNull); entity.HasOne(glass => glass.RightSide) .WithOne(side => side.RightOfGlass) .HasForeignKey<Glass>(glass => glass.RightSideId) .OnDelete(DeleteBehavior.ClientSetNull); });
内容的提问来源于stack exchange,提问作者dmdany07
相关产品推荐
相关产品推荐

