首页 > 解决方案 > EF Core 无法确定“ICollection”类型的导航属性“Colour.ColourGroups”表示的关系'

问题描述

我在旧数据库中有以下 3 个表。

CREATE TABLE Colour(
ColourCode char(3) NOT NULL,
CONSTRAINT PK_Colour PRIMARY KEY CLUSTERED 
(
    ColourCode ASC
)

CREATE TABLE ColourGroup(
    ColourGroup varchar(6) NOT NULL,
 CONSTRAINT PK_ColourGroup PRIMARY KEY CLUSTERED 
(
    ColourGroup ASC
)

CREATE TABLE Colour_ColourGroup(
    ColourCode char(3) NOT NULL,
    ColourGroup varchar(6) NOT NULL,
 CONSTRAINT PK_Colour_ColourGroup PRIMARY KEY CLUSTERED 
(
    ColourCode ASC,
    ColourGroup ASC
)

ALTER TABLE Colour_ColourGroup  WITH CHECK ADD  CONSTRAINT FK_Colour_ColourGroup_Colour FOREIGN KEY(ColourCode)
REFERENCES Colour (ColourCode)

ALTER TABLE Colour_ColourGroup  WITH CHECK ADD  CONSTRAINT FK_Colour_ColourGroup_ColourGroup FOREIGN KEY(ColourGroup)
REFERENCES ColourGroup (ColourGroup)

以及以下 EF 类在代码中表示它们

public class Colour
{
    public string ColourId { get; set; }

    public ICollection<ColourGroup> ColourGroups { get; set; }
}
public class ColourGroup
{
    public string ColourGroupId { get; set; }

    public ICollection<Colour> Colours { get; set; }
}
public class ColourColourGroup
{
    public string ColourId { get; set; }
    public string ColourGroupId { get; set; }

    public Colour Colour { get; set; }
    public ColourGroup ColourGroup { get; set; }

}

我正在使用 Fluent API 将 ColourColourGroup 链接到 Colour_ColourGroup 表并指定一些数据库列名。

builder.Entity<Colour>(entity =>
{
    entity.Property(e => e.ColourId).HasColumnType("char(3)")
          .HasColumnName("ColourCode");
    entity.Property(e => e.FinishId).HasMaxLength(3);
    entity.Property(e => e.Description).HasMaxLength(30);
    entity.HasKey(e => e.ColourId);
});
builder.Entity<ColourGroup>(entity =>
{
    entity.Property(e => e.ColourGroupId).HasMaxLength(6)
          .HasColumnName("ColourGroup");
    entity.HasKey(e => e.ColourGroupId);
});
builder.Entity<ColourColourGroup>(entity =>
{
    entity.ToTable("Colour_ColourGroup");
    entity.Property(e => e.ColourGroupId).HasMaxLength(6)
          .HasColumnName("ColourGroup");
    entity.Property(e => e.ColourId).HasMaxLength(3)
          .HasColumnName("ColourCode");
    entity.HasKey(e => new { e.ColourId, e.ColourGroupId });
});

但我不知道如何将 3 个表链接在一起。如果它只是 Color 和 ColourGroup 之间的一对多关系,我认为您会在 ColourGroup.Colours 上使用 InverseProperty(或 Fluent 等价物)。

访问这些实体的任何查询都会因上述错误而失败,例如:

var group = _context.ColourGroups.Where(g => g.ColourGroupId == "ALLPC").FirstOrDefault();

如何告诉 EF Colour.ColourGroups 和 ColourGroup.Colours 属性由 ColourColourGroup 中的相应属性“映射”?

标签: entity-framework-coreef-fluent-api

解决方案


推荐阅读