EF创建一对多关联模型时出现循环引用溢出问题求解
解决EF一对多单向关联循环引用问题
要实现仅DefaultEvent包含DefaultCommitteeAgenda的无循环关联,只需将关联改为单向一对多,移除子实体的反向导航属性并调整EF配置即可,具体步骤如下:
1. 修改实体类定义
删除DefaultCommitteeAgenda中的Event导航属性,只保留外键字段DefaultEventId:
public class DefaultCommitteeAgenda { public int Id { get; set; } public int DefaultEventId { get; set; } // 移除反向导航属性:public DefaultEvent Event { get; set; } }
DefaultEvent实体保持原有定义不变:
public class DefaultEvent { public int DefaultEventId { get; set; } public virtual ICollection<DefaultCommitteeAgenda> DefaultCommitteeAgendas { get; set; } }
2. 调整EF Fluent API配置
修改DefaultEvent的配置
将.WithOne(x => x.Event)改为.WithOne(),因为子实体已无反向导航属性:
public void Configure(EntityTypeBuilder<DefaultEvent> builder) { builder.HasKey(a => a.DefaultEventId); builder.Property(a => a.DefaultEventId).HasColumnName("idDefaultEvent"); // 配置单向一对多关联 builder.HasMany(x => x.DefaultCommitteeAgendas) .WithOne() // 子实体无反向导航,此处留空 .HasForeignKey(x => x.DefaultEventId); builder.ToTable("ftDefaultEvent", "dbo"); }
修改DefaultCommitteeAgenda的配置
调整HasOne配置,不指定反向导航属性:
public void Configure(EntityTypeBuilder<DefaultCommitteeAgenda> builder) { builder.HasKey(x => x.Id); builder.Property(x => x.Id) .HasColumnName("idDefaultCommitteeAgenda") .ValueGeneratedOnAdd(); builder.Property(x => x.DefaultEventId) .HasColumnName("idDefaultEvent") .IsRequired(); // 配置单向关联的外键 builder.HasOne<DefaultEvent>() // 指定关联的主实体类型 .WithMany() // 主实体的集合导航无需指定具体属性 .HasForeignKey(x => x.DefaultEventId); builder.ToTable("ftDefaultCommitteeAgenda", "dbo"); }
完成上述修改后,EF只会建立DefaultEvent到DefaultCommitteeAgenda的单向关联,不会存在双向导航导致的循环引用问题。
内容的提问来源于stack exchange,提问作者Raventus
相关产品推荐
相关产品推荐

