EF «многие ко многим» на одном объекте - PullRequest
1 голос
/ 01 апреля 2012

У меня проблема с реализацией отношений «многие ко многим» с одними и теми же объектами. Вот мой класс:

public class District
{
    [Key]
    public int DistrictId { get; set; }

    [Required]
    public string Title { get; set; }

    [Required]
    public string Abbreviation { get; set; }

    public List<District> SubDistricts { get; set; }
}

Моя цель состоит в том, чтобы все районы были в одной таблице, и чтобы они были соотнесены, многие районы со многими районами.

Если я не указываю отображения, EF Code First действует так, как будто это отношение один-ко-многим.

Я пытался дать указания сборщику моделей, но он не работает:

modelBuilder.Entity<District>()
    .HasMany(d => d.SubDistricts)
    .WithMany(d => d.SubDistricts)
    .Map(mc => { mc.ToTable("DistrictLinks", "dbo");
                 mc.MapLeftKey("ParentId");
                 mc.MapRightKey("ChildId");
               });

Есть ли способ сделать это с WF? Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 01 апреля 2012

Вы должны использовать перегрузку WithMany, которая не принимает параметр:

modelBuilder.Entity<District>()
    .HasMany(d => d.SubDistricts)
    .WithMany()
    .Map(mc => { mc.ToTable("DistrictLinks", "dbo");
                 mc.MapLeftKey("ParentId");
                 mc.MapRightKey("ChildId");
               });

Невозможно, чтобы одно и то же свойство навигации было началом и концом ассоциации одновременно.Они либо должны быть разными, либо конец «невидим» и не виден в модели, как в вашей модели.

2 голосов
/ 02 апреля 2012

Ваше решение работает хорошо, спасибо! Тем временем я нашел другой способ решения проблемы. В основном я создал два навигационных свойства в классе:

public List<District> ChildDistricts { get; set; }
public List<District> ParentDistricts { get; set; } 

так что мое отображение теперь выглядит так:

modelBuilder.Entity<District>()
    .HasMany(d => d.ParentDistricts)
    .WithMany(d => d.ChildDistricts)
    .Map(mc => { mc.ToTable("DistrictLinks", "dbo");
                 mc.MapLeftKey("ParentId");
                 mc.MapRightKey("ChildId");
               });

В результате я получаю точно такую ​​же таблицу в SQL Server, но я считаю, что могу лучше перемещаться, как это. Я на самом деле забыл упомянуть, что здесь важна иерархия, а не просто связь между районами.

Еще раз спасибо:)

...