DotNetCore Entity Framework многие-ко-многим за одним столом - PullRequest
0 голосов
/ 26 июня 2018

Я использую DotNetCore 2 и хочу создать сценарий, в котором у меня есть одна модель, которая может содержать ноль или более одинаковых моделей.

Рассмотрим следующий сценарий (для простоты):

  • Двигатель может состоять из множества частей (компонентов)
  • Каждая часть может содержать ноль или более других частей (компонентов)

Я хочу связать этиэлементы как таковые:

Система

Id    Name
----------------
1     Drive System

Компонент

Id    Name
----------------
1     Motor
2     Bearings
3     Couplings
4     Fixtures

С отношением многих ко многиммежду System и Component как таковыми:

SystemComponents

SystemId    ComponentId
-------------------------
1           1

И многие ко многим ссылаются на Component (из-за отсутствия лучшеголучшее имя)

ComponentComponents

ParentId    ChildId
---------------------
1           2
1           3
1           4

Таким образом, в приведенном выше сценарии можно перевести как Система привода имеет компонент - двигатель и двигательимеет дополнительные подкомпоненты, «Подшипники», «Муфты» и «Приспособления»

Соотношение SytemComponent работает.Для отношения ComponentComponent я попробовал следующее с моей миграцией кода:

Компонент

public class Component 
{
    public Component() 
    {
        SystemComponents = new Collection<SystemComponent>();
        ChildComponents = new Collection<Component>();
    }

    public int Id { get; set; }
    public string Name { get; set; }

    // Needs this for the Many to Many relationship
    public virtual ICollection<SystemComponent> SystemComponents { get; set; }

    // Any component can contain one or more existing components
    public virtual ICollection<Component> ChildComponents { get; set; }
}

ComponentComponent модель связи:

public class ComponentComponent
{
    public int ParentComponentID { get; set; }
    public int ChildComponentID { get; set; }

    public Component ParentComponent { get; set; }
    public Component ChildComponent { get; set; }
}

С моей ComponentComponent конфигурацией:

public class ComponentComponentConfiguration : IEntityTypeConfiguration<ComponentComponent> {
    public void Configure(EntityTypeBuilder<ComponentComponent> builder) {
        builder.ToTable("ComponentComponent");

        builder.HasKey(cc => new { cc.ParentComponentID, cc.ChildComponentID });

        builder.HasOne(cc => cc.ParentComponent)
            .WithMany(c => c.ComponentComponents)
            .HasForeignKey(cc => cc.ParentComponentID);

        builder.HasOne(cc => cc.ChildComponent)
            .WithMany(c => c.ComponentComponents)
            .HasForeignKey(cc => cc.ChildComponentID);
    }
}

При запуске миграции я получаю следующую ошибку:

Невозможно создать связь между«Component.ComponentComponents» и «ComponentComponent.ChildComponent», поскольку уже существует связь между «Component.ComponentComponents» и «ComponentComponent.ParentComponent».Свойства навигации могут участвовать только в одной взаимосвязи.

Как бы я достиг такой взаимосвязи в Entity Framework в DotNetCore 2?

РЕДАКТИРОВАТЬ

Я загрузил похожий пример проекта на свою страницу github:

https://github.com/JAspeling/Many-to-Many

1 Ответ

0 голосов
/ 28 июня 2018

Похоже, проблема в вашем классе компонентов.Вместо ссылки на набор компонентов он должен выглядеть следующим образом:

public class Component 
{
    public Component() 
    {
        SystemComponents = new Collection<SystemComponent>();
        ChildComponents = new Collection<ComponentComponent>();
    }

    public int Id { get; set; }
    public string Name { get; set; }

    // Needs this for the Many to Many relationship
    public virtual ICollection<SystemComponent> SystemComponents { get; set; }

    // Any component can contain one or more existing components
    public virtual ICollection<ComponentComponent> ChildComponents { get; set; }
}

Вам необходимо сделать ссылку на таблицу сопоставления.

https://docs.microsoft.com/de-de/ef/core/modeling/relationships#many-to-many

...