我遇到的问题是:我需要获取多个导航属性才能在前端显示数据。我正在使用 .Include() 来获取这些。默认情况下, Include 会进行内部联接,我明白了。我还读到,如果导航属性可以为空并且数据库中的列类型可以为空,那么它将执行 LEFT JOIN 。我的查询仍然使用 INNER JOIN ,即使我的两个 FK 列都可以为空。
这是我的询问
var listOfProductsOnSets = await productWithSetsRepository
.FindQueryable(asoc => asoc.IdSet == idSet)
.Include(c => c.AsCuloare)
.ThenInclude(cc => cc!.CodCuloare)
.Include(d => d.AsDimensiune)
.AsSplitQuery()
.ToListAsync();
这是我的课:
public class AsociereSeturi
{
// Attributes
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int IdAsociereSet { get; init; }
// Foreign Keys
public int IdProdus { get; init; }
public Produse Produs { get; init; } = null!;
public int IdSet { get; init; }
public Seturi Set { get; init; } = null!;
public int? IdCuloare { get; init; }
public Culori? AsCuloare { get; init; }
public int? IdDimensiune { get; init; }
public Dimensiuni? AsDimensiune { get; init; }
public ICollection<ProduseCuComenzi> CombinatieSetPeComanda { get; }
}
这些是我的日志:
SELECT a.id_asociere_set, a.id_culoare, a.id_dimensiune, a.id_produs, a.id_set,
c.id_culoare, c.id_cod_culoare, c.nume_culoare,
d.id_dimensiune, d.latime, d.lungime, d.PerdeaEstePereche, d.recomandare_pat
FROM asociere_seturi AS a
INNER JOIN culori AS c ON a.id_culoare = c.id_culoare
INNER JOIN dimensiuni AS d ON a.id_dimensiune = d.id_dimensiune
WHERE a.id_set = @__idSet_0;
您可以添加用于解析关系和 FK 的配置吗?
按照惯例,EF 不会解析“IdCuloare”,或者肯定不会将“id_culoare”解析为类型为Culoare
的名为 AsCuloare 的导航属性的 FK。默认情况下,它将查找“CuloareId”或“Culoare_Id”。代码中的
OnModelCreating
或
IEntityTypeConfiguration<Culoare>
中必须有一些配置来配置该关联,我怀疑您会发现它将其标记为
.IsRequired(true)
。删除它应该将连接更正为可选 /w
LEFT JOIN
。