EF Core为何给RidePrice模型添加RideId1影子属性?如何消除?
EF Core 自动生成RideId1影子属性的原因及解决方法
问题根源
出现RideId1影子属性的核心原因是重复配置了Ride与RidePrice的一对多关系:
- 在
Ride的Fluent配置中,已经通过HasMany(x => x.Prices).WithOne(x => x.Ride)明确了双向关联,指定外键为RideId - 又在
RidePrice的Fluent配置里,再次调用HasOne(x => x.Ride).WithMany()配置了一次单向关系。EF会将这视为两个独立的关系,由于第二次配置没有关联到Ride端的Prices导航属性,EF自动生成了RideId1影子属性来映射这个多余的关系。
解决方法
只需要保留一组关系配置即可,推荐保留Ride端的双向配置,删除RidePrice端重复的Ride关系配置。修改后的Fluent API代码如下:
modelBuilder.Entity<Ride>(entityBuilder => { entityBuilder.HasMany(x => x.Prices).WithOne(x => x.Ride) .HasForeignKey(x => x.RideId) .HasPrincipalKey(x => x.Id); entityBuilder.HasMany(x => x.Waypoints).WithOne(); }); modelBuilder.Entity<Waypoint>(entityBuilder => { entityBuilder.HasOne(x => x.Ride).WithMany(x => x.Waypoints); }); modelBuilder.Entity<RidePrice>(entityBuilder => { entityBuilder.HasKey(x => new { x.FromId, x.ToId }); entityBuilder.HasOne(x => x.From).WithMany().HasForeignKey(x => x.FromId); entityBuilder.HasIndex(x => x.FromId); entityBuilder.HasOne(x => x.To).WithMany().HasForeignKey(x => x.ToId); entityBuilder.HasIndex(x => x.ToId); // 移除这段重复的Ride关系配置 // entityBuilder.HasOne(x => x.Ride).WithMany() // .HasForeignKey(x => x.RideId) // .HasPrincipalKey(x => x.Id); });
补充说明
- 即使移除RidePrice中的
RideId和Ride属性,EF仍会生成其他影子属性,是因为Ride类中的Prices导航属性依然存在,EF会自动尝试创建反向关系,找不到对应导航属性时就会生成影子外键。 - 该问题与Waypoint无关,完全是Ride与RidePrice的关系配置重复导致的。
内容的提问来源于stack exchange,提问作者AnatolyBelanov
相关产品推荐
相关产品推荐

