Я использую 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