Самоссылающаяся таблица EF6 с несколькими родительскими свойствами, одной дочерней коллекцией

У меня есть таблица, которая ссылается на себя, но я изо всех сил пытаюсь получить желаемое отображение. Я хочу иметь возможность определить Детей как совокупность людей, у которых данный человек является Матерью, Отцом и/или Хранителем. Опекуном может быть отец или мать.

Я хочу иметь древовидное представление людей, которое можно просматривать, где перечислены люди; пользователь может развернуть узел человека, чтобы показать всех детей этого человека, независимо от отношения, определяющего ребенка (мать, отец или опекун).

public partial class Person
{
    [Key]
    public int ID { get; set; }

    [StringLength(100)]
    public string Name { get; set; }


    public int? GuardianID { get; set; }

    [Column("MotherID")]
    public int? MotherID { get; set; }


    [Column("FatherID")]
    public int? FatherID { get; set; }

    [ForeignKey("MotherID")]
    public virtual tblPerson Mother { get; set; }

    [ForeignKey("FatherID")]
    public virtual tblPerson Father { get; set; }

    [ForeignKey("GuardianID")]
    public virtual tblPerson Guardian { get; set; }

    [InverseProperty("Guardian")]
    [InverseProperty("Father")]
    [InverseProperty("Mother")]
    public virtual IEnumerable<tblPerson> children { get; set; }
}

Любая помощь будет оценена прямо сейчас, мой взгляд должен выглядеть так:

    @using Person_MVC.Models
    @model IEnumerable<Person>
    @{
        IEnumerable<Person> children;
    }

    <ul>
        @foreach (Person person in Model.OrderBy(p => p.PersonNumber))
        {
            <li id="[email protected]" data-jstree='{"type":"Person"}' data-Personkey="@Person.ID.ToString()">
                @Person.Name
                @{
            PersonModel db = new PersonModel();
            children = (from p in db.Persons where p.GuardianID == Person.ID || p.Father == Person.ID || p.MotherID == Person.ID select p).ToList();
                }
                @if (children != null && children.Count() > 0)
                {
                    @Html.Partial("PersonTree", children)
                }
            </li>
        }
    </ul>

person Mothware    schedule 11.06.2015    source источник


Ответы (3)


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

e.g.

public int? FatherId { get; set; }

public int? GrandFatherId { get; set; }

public int? MotherId { get; set; }

public virtual ICollection<Person> FatherForThose { get; set; }
public virtual Person Father { get; set; }

public virtual ICollection<Person> GrandFatherForThose { get; set; }
public virtual Person GrandFather { get; set; }

public virtual ICollection<Person> MotherForThose { get; set; }
public virtual Person Mother { get; set; }


public ICollection<Person> GetChildren()
{
    var list = FatherForThose.Concat(MotherForThose).ToList();
    foreach (var person in GrandFatherForThose)
    {
        if (list.All(i => i.Id != person.Id))
        {
            list.Add(person);

        }
    }
    return list;
}

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

var grand = context.Persons.Include(x => x.FatherForThose)
            .Include(x => x.GrandFatherForThose)
            .Include(x => x.MotherForThose)
            .FirstOrDefault(x => x.Id == 2);

var list = grand.GetChildren();
person Wahid Bitar    schedule 08.01.2016

  1. Все данные таблицы должны быть на руках (в противном случае у нас может быть несколько обращений к базе данных).
  2. Найдите список всех лиц, у которых нет родителей (т. е. нет опекуна, матери, родителя для человека) и начните с них частичное.
person Sunil Sistla    schedule 06.01.2016

Попробуйте, может и это...

public partial class Person
    {
        [Key]
        public int ID { get; set; }

        [StringLength(100)]
        public string Name { get; set; }


        public int? GuardianID { get; set; }

        [Column("MotherID")]
        public int? MotherID { get; set; }


        [Column("FatherID")]
        public int? FatherID { get; set; }

        public IEnumerable<Person> Children { get
                {
                    return context.Person.Where(p => p.GuardianID == this.ID || p.Father == this.ID  || p.MotherID == this.ID).ToList();
                } 
        }
    }





 @using Person_MVC.Models
    @model IEnumerable<Person>

    <ul>
        @foreach (Person person in Model.OrderBy(p => p.PersonNumber))
        {
            <li id="[email protected]" data-jstree='{"type":"Person"}' data-Personkey="@Person.ID.ToString()">
                @Person.Name

                @if (Person.Children != null && Person.Children.Count() > 0)
                {
                    @Html.Partial("PersonTree", Person.Children)
                }
            </li>
        }
    </ul>
person J4ime    schedule 12.01.2016