EF 4.1 Многократные отношения «многие ко многим» в одном классе - PullRequest
1 голос
/ 27 мая 2011

У меня есть класс с несколькими отношениями «многие ко многим», отображающими один и тот же вторичный класс.У моего класса EquipmentSet есть два массива объектов Equipment, а у класса Equipment также есть массив наборов Equipment, чтобы определить, в какие наборы входит оборудование.

EF создает таблицу поиска только для второго отношения «многие ко многим».Как я могу сказать EF генерировать таблицы поиска для обоих?При использовании приведенного ниже кода создается только таблица «ModelSpecificEquipment».Таблица «GlobalEquipment» никогда не генерируется.

public partial class EquipmentSet 
{
    public int Id { get; set; }
    public List<Equipment> Global { get; protected set; }
    public List<Equipment> ModelSpecific { get; protected set; }

    public EquipmentSet()
    {
        Global = new List<Equipment>();
        ModelSpecific = new List<Equipment>();
    }
}


public partial class Equipment
{
    public int Id { get; set; }
    public List<EquipmentSet> EquipmentSets { get; set; }

    public Equipment()
    {
    }
}



public class DataContext : DbContext
{
    public DbSet<Equipment>  Equipment { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Equipment>()
            .HasMany<EquipmentSet>(x => x.EquipmentSets)
            .WithMany(x => x.Global)
            .Map(x =>
            {
                x.MapLeftKey("EquipmentId");
                x.MapRightKey("EquipmentSetId");
                x.ToTable("GlobalEquipment");
            });

        modelBuilder.Entity<Equipment>()
            .HasMany<EquipmentSet>(x => x.EquipmentSets)
            .WithMany(x => x.ModelSpecific)
            .Map(x =>
            {
                x.MapLeftKey("EquipmentId");
                x.MapRightKey("EquipmentSetId");
                x.ToTable("ModelSpecificEquipment");
            });
        base.OnModelCreating(modelBuilder);
    }
}

Опять же, на данный момент база данных, которую создает EF, содержит только 3 таблицы: EquipmentSets, Equipments, ModelSpecificEquipments.GlobalEquipments отсутствует.

1 Ответ

1 голос
/ 27 мая 2011

Я думаю, что это невозможно отобразить.Вы не можете связать две конечные точки на одной стороне с одной конечной точкой на другой стороне отношений.Вам, вероятно, понадобится что-то вроде этого:

public partial class Equipment
{
    public int Id { get; set; }
    public List<EquipmentSet> GlobalEquipmentSets { get; set; }
    public List<EquipmentSet> ModelSpecificEquipmentSets { get; set; }

    public IEnumerable<EquipmentSet> EquipmentSets
    {
        get
        {
            return GlobalEquipmentSets.Concat(ModelSpecificEquipmentSets);
            // catch cases when one or both of the sets are null.
        }
    }
}

EquipmentSets - это только помощник только для чтения, который не сопоставлен с базой данных.

После этого вы можете создать множество длямножество отношений между Global и GlobalEquipmentSets и другое отношение многих ко многим между ModelSpecific и ModelSpecificEquipmentSets.

...