EF Core Невозможно определить отношение, представленное свойством навигации 'Colour.ColourGroups' типа 'ICollection <ColourGroup>' - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть следующие 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, я думаю, что вы использовали бы InverseProperty (или любой другой эквивалент Fluent) в ColourGroup.Colours.

Любой запрос, который обращается к этим объектам, завершается с ошибкой, например:

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

Как мне сообщить EF, что свойства Colour.ColourGroups и ColourGroup.Colours "отображаются" соответствующими свойствами в ColourColourGroup?

...