2016-10-31 2 views
1

фонСоздать автореферентное Иерархическая таблицу в Entity Framework

У меня есть класс, который выглядит более или менее, как это:

public class MyClass 
{ 
    [Id] 
    public long Id { get; set; } 

    public string MyProperty { get; set; } 
    public bool MyBoolean { get; set; } 
    public string AnotherProperty { get; set; } 

    public MyClass ChildOne { get; set; } 
    public MyClass ChildTwo { get; set; } 
} 

мне нужно будет использовать хранимую процедуру для загрузки набора записей, но это нормально, если сама структура верна.

Для любого экземпляра MyClass один или оба из этих детей могут быть пустыми. Любой экземпляр MyClass может использоваться в родительском классе, но сам ребенок не должен знать об этом отношении, а ребенок может использоваться любым номером родителей.

Проблема

С этой структурой, я получаю следующее сообщение об ошибке при создании новой миграции:

Невозможно определить основной конец связи между типов «MyClass» и " Мои занятия'. Основной конец этой ассоциации должен быть явно сконфигурирован с использованием либо свободного API API , либо аннотаций данных.

Эта ошибка имеет смысл - если задана структура объекта с внешним ключом для себя, я не удивлюсь, что EF с трудом определяет основной конец. Я не уверен, как это исправить.

Я пробовал несколько различных Fluent отображения:

modelBuilder.Entity<MyClass>().HasOptional(x => x.ChildOne).WithOptionalPrincipal(x => x.ChildOne); 
modelBuilder.Entity<MyClass>().HasOptional(x => x.ChildOne).WithOptionalDependent(x => x.ChildOne); 
modelBuilder.Entity<MyClass>().HasOptional(x => x.ChildOne); 

(Примечание:. Я не пробовал это одновременно - я сделал по одному & дублируется его ChildTwo)

I было, способное перейти на работу, добавив свойство MyClass к свойству ChildThree, но это не имеет смысла и не является полезным свойством; он просто создает другой внешний ключ на столе, но это не нужно в моей модели.

Итак, в заключение:

  1. Как получить эту структуру, чтобы работать так, как я хочу? Я думаю, что секрет в некотором Fluent mapping voodoo, но я очень незнакомый с этой библиотекой, и я не знаю, как заставить это работать.

  2. Почему добавление третьего (ненужного, нежелательного) имущества исправить все и разрешить переход на эшафот?

ответ

0

Ваше свободное изображение совершенно неверно.

Вы должны сделать что-то вроде этого:

modelBuilder.Entity<MyClass>().HasOptional(p => p.ChildOne).WithOptionalDependent(); 
modelBuilder.Entity<MyClass>().HasOptional(p => p.ChildTwo).WithOptionalDependent();