【问题标题】:Why EF Core generates INNER Join when selecting single entity without any Include()为什么 EF Core 在选择没有任何 Include() 的单个实体时会生成 INNER Join
【发布时间】:2022-07-12 16:23:09
【问题描述】:

为什么要关注单个实体查询

this.DbContext.MaterialInfo.FirstOrDefault(m => m.KódMateriálu == "001");

生成 INNER JOIN?

SELECT TOP(1) [m].[MaterialCode], [m].[Id]
FROM [Material] AS [m]
INNER JOIN [Material] AS [m0] ON [m].[MaterialCode] = [m0].[MaterialCode]
WHERE [m].[Id] IS NOT NULL AND ([m].[MaterialCode] = N'001')

这里是实体配置:

public class MaterialInfoConfiguration : IEntityTypeConfiguration<MaterialInfo>
{
    public void Configure(EntityTypeBuilder<MaterialInfo> entity)
    {
        entity.ToTable("Material");
        entity.HasKey(e => e.MaterialCode);                
        entity.Property(e => e.Id).HasColumnName("ID"); //legacy column, no longer a PK, but still and IdenityColumn 
   
        entity.HasOne<Material>() //maps to the same table
            .WithOne()
            .IsRequired(false)
            .HasForeignKey<MaterialInfo>(e => e.MaterialCode)
            .HasPrincipalKey<Material>(e => e.MaterialCode)
            .HasConstraintName("FK_MaterialInfo_Material_MaterialCode");
    }   
}

【问题讨论】:

  • 我猜是因为在您的定义中是HasOne,所以内部连接是为了确保您的记录确实有一个匹配的记录。否则你可能会返回一条没有匹配记录的记录
  • "否则你可能会返回一条没有匹配记录的记录" > 但是 EF 为什么要关心呢?
  • 我在这里几乎是在猜测,但我认为是 HasOne、WithOne 等的组合迫使它确保始终有匹配的记录。

标签: c# sql entity-framework-core .net-6.0


【解决方案1】:

我认为你不能使用

.HasOne<Material>() 

替换为

.HasOne<MaterialInfo>()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    相关资源
    最近更新 更多