EF Core关联查询生成错误Join语句,如何修正实体关系配置?
问题根源
你的配置混淆了Product和ProductVersion之间的两组独立关系:
- 一对多关系:1个Product对应多个ProductVersion,ProductVersion通过
ProductId关联所属Product - 一对一引用关系:Product通过
PreferredProductVersionId关联指定的首选版本,无反向导航
第一步 修正Product的关系配置
修改ProductConfiguration,明确一对多的反向导航,单独配置首选版本的一对一关系:
public class ProductConfiguration : IEntityTypeConfiguration<Product> { public void Configure(EntityTypeBuilder<Product> builder) { builder.HasKey(s => s.ProductId); builder .Property(s => s.ProductId) .ValueGeneratedOnAdd() .IsRequired(); builder.Property(s => s.Name) .IsRequired() .HasColumnType("varchar(50)"); // 修正:指定反向导航为ProductVersion的Product属性,绑定一对多关系 builder.HasMany(s => s.ProductVersion) .WithOne(x => x.Product) .HasForeignKey(f => f.ProductId) .OnDelete(DeleteBehavior.NoAction); // 新增:单独配置首选版本的一对一关系,无反向导航 builder.HasOne(s => s.PreferredProductVersion) .WithOne() .HasForeignKey<Product>(s => s.PreferredProductVersionId) .OnDelete(DeleteBehavior.SetNull); } }
第二步 修正ProductVersion的配置
删除ProductVersionConfiguration中错误绑定的一对一关系即可:
public class ProductVersionConfiguration : IEntityTypeConfiguration<ProductVersion> { public void Configure(EntityTypeBuilder<ProductVersion> builder) { builder.HasKey(s => s.ProductVersionId); builder .Property(s => s.ProductVersionId) .ValueGeneratedOnAdd() .IsRequired(); builder.Property(s => s.Name) .IsRequired() .HasColumnType("varchar(50)"); } }
生效说明
之前出错是因为你把ProductVersion.Product导航属性错误绑定到了首选版本的一对一关系上,导致EF生成查询时用ProductVersionId = PreferredProductVersionId作为JOIN条件。修正后ProductVersion.Product导航属性对应一对多的所属产品关系,JOIN条件自动变为ProductId = ProductId,符合你的预期。
内容的提问来源于stack exchange,提问作者dgrs
相关产品推荐
相关产品推荐

