EF Code-First миграция многие ко многим, игнорирующая спецификацию таблицы ссылок - PullRequest
0 голосов
/ 13 мая 2019

Я попытался добавить новое отношение «многие ко многим» между двумя таблицами в моей модели БД.Сгенерированная миграция игнорирует указанную мной таблицу ссылок и вместо этого добавляет внешний ключ в левую таблицу.Как я могу это исправить?

Я использовал тот же формат спецификации для других отношений «многие ко многим», которые работали нормально.

public class Competitor
{
    [Key]
    public Guid ID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string FullName { get { return string.Format("{0} {1}", FirstName, LastName).Trim(); } }
    public bool IsMatchResult { get; set; }

    public virtual ICollection<Title> Titles { get; set; }
    public virtual ICollection<MatchParticipant> MatchesParticipated { get; set; }
    public virtual ICollection<MatchResult> MatchResults { get; set; }
    public virtual ICollection<TagTeam> TagTeams { get; set; }

    public virtual ICollection<Brand> Brands { get; set; }

}

public class Brand
{
    [Key]
    public Guid ID { get; set; }
    public string Name { get; set; }
    public Guid? ParentID { get; set; }

    [ForeignKey("ParentID")]
    public virtual Brand Parent { get; set; }
    public virtual ICollection<Event> Events { get; set; }

    public virtual ICollection<Competitor> Roster { get; set; }

}

modelBuilder.Entity<Brand>()
            .HasMany<Competitor>(c => c.Roster)
            .WithMany()
            .Map(mp =>
            {
                mp.MapLeftKey("BrandID");
                mp.MapRightKey("CompetitorID");
                mp.ToTable("BrandCompetitors");
            });

Полученная миграция:

    public override void Up()
    {
        CreateTable(
            "dbo.BrandCompetitors",
            c => new
                {
                    BrandID = c.Guid(nullable: false),
                    CompetitorID = c.Guid(nullable: false),
                })
            .PrimaryKey(t => new { t.BrandID, t.CompetitorID })
            .ForeignKey("dbo.Brand", t => t.BrandID, cascadeDelete: true)
            .ForeignKey("dbo.Competitor", t => t.CompetitorID, cascadeDelete: true)
            .Index(t => t.BrandID)
            .Index(t => t.CompetitorID);

        AddColumn("dbo.Brand", "Competitor_ID", c => c.Guid());
        CreateIndex("dbo.Brand", "Competitor_ID");
        AddForeignKey("dbo.Brand", "Competitor_ID", "dbo.Competitor", "ID");
    }

Я не понимаю, почему он создает новый столбец внешнего ключа для бренда, а не просто таблицу ссылок.

1 Ответ

1 голос
/ 14 мая 2019

Проблема в .WithMany().У вас есть явное свойство навигации, но вы не указали его в .WithMany().

Запишите свою конфигурацию следующим образом:

modelBuilder.Entity<Brand>()
            .HasMany<Competitor>(b => b.Roster)
            .WithMany(c => c.Brands) // <-- Here it is
            .Map(mp =>
            {
                mp.MapLeftKey("BrandID");
                mp.MapRightKey("CompetitorID");
                mp.ToTable("BrandCompetitors");
            });

Теперь все будет сгенерировано, как и ожидалось!

...