EF8报错:跳过导航'FurnitureItem.HandItems'未关联外键
解决EF8多对多关联配置中的跳过导航外键未关联错误
错误原因
你的多对多配置中,UsingEntity方法内的两个关联表关系配置方向搞反了,导致EF无法将导航属性与外键关联,从而抛出如下错误:
System.InvalidOperationException: 跳过导航'FurnitureItem.HandItems'未关联外键。所有跳过导航都必须配置外键。
修正方案
方案1:修正配置方向
交换UsingEntity中两个lambda的配置内容,确保外键与对应实体正确关联:
modelBuilder.Entity<FurnitureItem>() .HasMany(c => c.HandItems) .WithMany(x => x.FurnitureItems) .UsingEntity("furniture_hand_items", // 配置关联表到HandItem的映射:hand_item_id外键关联HandItem.Id l => l.HasOne(typeof(HandItem)).WithMany().HasForeignKey("hand_item_id").HasPrincipalKey(nameof(HandItem.Id)), // 配置关联表到FurnitureItem的映射:furniture_item_id外键关联FurnitureItem.Id r => r.HasOne(typeof(FurnitureItem)).WithMany().HasForeignKey("furniture_item_id").HasPrincipalKey(nameof(FurnitureItem.Id)), j => j.HasKey("furniture_item_id", "hand_item_id"));
方案2:使用泛型写法(更简洁不易错)
采用泛型HasOne替代typeof,让配置更清晰,避免方向混淆:
modelBuilder.Entity<FurnitureItem>() .HasMany(f => f.HandItems) .WithMany(h => h.FurnitureItems) .UsingEntity<Dictionary<string, object>>( "furniture_hand_items", j => j.HasOne<HandItem>().WithMany().HasForeignKey("hand_item_id"), j => j.HasOne<FurnitureItem>().WithMany().HasForeignKey("furniture_item_id"), j => j.HasKey("furniture_item_id", "hand_item_id"));
补充说明
原配置的核心问题是:UsingEntity的第一个lambda需对应**当前实体导航属性的目标实体(HandItem)的关联,第二个lambda对应当前实体(FurnitureItem)**的关联。原代码将两者的外键与实体映射搞反,导致EF无法匹配导航属性与外键配置,进而触发错误。
内容的提问来源于stack exchange,提问作者user24419920
相关产品推荐
相关产品推荐

