Доступ к дочернему объекту из родительского объекта в EF Core - PullRequest
0 голосов
/ 10 февраля 2020

Я искал все net, но все равно не могу заставить это работать.

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

  • ParentName1
  • ChildName1
  • ChildName2
  • ParentName2
  • ChildName3

У меня есть одна таблица объектов Parent и один из объектов Child. В таблице дочерних объектов есть внешний ключ ParentId.

Теперь я использую строго типизированный ViewModel, и Intellisense даже предлагает свойства Child через Parent.Child.Property, но затем, когда я запускаю программу, я получить «NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта.».

Мой родительский класс выглядит следующим образом:

    public class EmployeeArea
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int ID { get; set; }

        public int? StudioCode { get; set; }

        public string AreaName { get; set; }

        public List<EmployeeName> EmployeeNames { get; set; }
    }
}

И Мой класс Child выглядит следующим образом:

    public class EmployeeName
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int ID { get; set; }

        public string Name { get; set; }

        public int AreaId { get; set; }
    }
}

Нужно ли что-то делать в DbContext ModelBuilder? Я приветствую любую помощь. Спасибо!

Ответы [ 2 ]

1 голос
/ 10 февраля 2020

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

public int EmployeeAreaId {get; set;}

, тогда у вас есть два варианта получения данных из базы данных. Если вы используете EF, то:

db.EmployeeArea.Include(e => e.EmployeeName).ToList();

, который вернет список employeeArea, включая дочерний список.

Использование Linq будет выглядеть так:

var employeeArea = (from e in db.EmployeeArea
                    select new EmployeeArea
                               {
                                  Id = e.Id
                                  // continue populating the model properties
                                  EmployeeNames = db.EmployeeName.Where(e => 
                                  e.EmployeeAreaId == e.Id).ToList(),
                               }).ToList()

Извините за любую опечатку здесь. Надеюсь, это поможет.

Обязательно прокручивая родителей, проверьте, является ли их список детей null .

0 голосов
/ 10 февраля 2020

Сначала необходимо правильно определить внешний ключ, переопределив OnModelCreating или по соглашению:

public int EmployeeAreaId {get; set;}

Если вы используете строго типизированные ViewModels, вам нужно использовать проекции EFCore (https://entityframeworkcore.com/querying-data-projection), код будет выглядеть примерно так (замените вашими именами моделей):

db.EmployeeAreas.Select(e => new YourViewModel{
  ParentName = e.AreaName,
  ChildNames = e.EmployeeNames.Select(en => new List<string>{
    EmployeeName = en.Name
  }).ToList();
}).ToList();

Если бы это было Json, это выглядело бы так:

[
  {
    ParentName : "ParentName1",
    ChildNames ; ["ChildName1","ChildName2"]
  },
  {
    ParentName : "ParentName2",
    ChildNames ; ["ChildName3"]
  }
]
...