Как заставить работать мою структуру с EF Core, используя Fluent Api? - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь представить какое-то дерево, используя ef core и postgre sql.У меня есть два класса:

public class ProtocolNode
{
    public Guid Id { get; set; }

    public string Name { get; set; }

    public ICollection<ProtocolCriteria> Criterias { get; set; }

    public ProtocolNode()
    {
        Criterias = new List<ProtocolCriteria>();
    }

}

public class ProtocolCriteria
{
    public Guid Id { get; set; }

    public Guid? ParentId { get; set; }

    public ProtocolNode Parent { get; set; }

    public Guid? ChildrenId { get; set; }

    public ProtocolNode Children { get; set; }
}

После этого я пытаюсь запустить миграцию для создания базы данных, но получаю ошибку:

Невозможно определить отношение, представленноесвойство навигации 'ProtocolCriteria.Parent' типа 'ProtocolNode'.Либо настройте отношение вручную, либо игнорируйте это свойство с помощью атрибута «[NotMapped]» или с помощью «EntityTypeBuilder.Ignore» в «OnModelCreating».

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

1 Ответ

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

Как правило, нисходящая древовидная структура состоит из равных узлов, которые имеют два основных свойства: parent & siblings

public class node {
    public int Id {get; set;}
    public int? ParentId {get; set;}  // top node has no parent
    public virtual Node Parent {get; set;}
    public virtual ICollection<Node> Children {get; set;}
}

builder.Entity<Node>()     // ModelBuilder
    .HasOptional(c => c.Parent)
    .WithMany()
    .HasForeignKey(c => c.ParentId);

EF значительно упрощает синтаксический анализ дочерних элементов, чем ведение связанных списков.Предполагается, что вы НЕ говорите о двоичных деревьях, которые являются особым случаем.

Примечание: EF Core еще не реализовал функцию HasOptional ().

...