Попытка получить встроенные / связанные классы, используя C# Entity Framework - PullRequest
0 голосов
/ 26 февраля 2020

Предположим, у меня есть такая структура данных - где у объекта Person может быть много адресов, а у адреса могут быть строки с адресами Мэнни.

public class Person
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public List<Address> Addresses { get; set; }
}


public class Address
{
    public int Id { get; set; }
    public List<AddressLine> AddressLines { get; set; } 
    public string PostCode { get; set; }
}

public class AddressLine
{
    public int Id { get; set; }
    public string AddressLine
}

Затем я использовал Entity Framework, чтобы разрешить эту структуру данных. чтобы быть сохраненным в моей базе данных таким образом:

public class DatabaseContext : DbContext
{
    public DatabaseContext() : base("name=DatabaseConnection") { }
    public DatabaseContext(string connectionString) : base(connectionString) { }
    public DbSet<Person> People { get; set; }
}

Наконец, у меня есть класс, который взаимодействует с этой базой данных:

public class ProcessPeople
{
    private DatabaseContext localDatabase;

    ProcessPeople(DatabaseContext db)
    {
        localDatabase = db;
    }

    public DoProcessingOfPerson(int idOfPerson)
    {
         Person person =
                localDatabase.People.Where(p => p.Id.Equals(idOfPerson)).FirstOrDefault();

         Console.WriteLine("First  : " + person.FirstName);
         Console.WriteLine("Last   : " + person.LastName);

         // Print address
         if(person.Addresses != null && person.Addresses.Count > 0)
         {
             if(person.Addresses[0].AddressLines != null && person.Addresses[0].AddressLines.Count > 0)
             {
                 Console.WriteLine("Address: " + person.Addresses[0].AddressLines[0].AddressLine);
             }
         }
         else
         {
             Console.WriteLine("No address available");
         }
    }
}

Проблема заключается в том, что после того, как человек извлекается с использованием кода :

Person person =
      localDatabase.People.Where(p => p.Id.Equals(idOfPerson)).FirstOrDefault();

Массив адресов имеет значение всегда null - даже если там есть определенно связанные данные Address и AddressLine.

Мой вопрос:

Как можно выполнить поиск из базы данных платформы Entity, чтобы все данные во встроенных классах внутри класса Person также были извлечены?

Я хочу отозвать человека назад, а затем иметь возможность перемещаться через массивы Addresses и AddressLines - но эти классы не извлекаются из базы данных [даже если они существуют в реальной базе данных, которая была сгенерирована структурой сущностей]

Обратите внимание, что для краткости я не включил код ввода данных - я просто ищу, что мне нужно сделать с этой строкой:

Person person =
    localDatabase.People.Where(p => p.Id.Equals(idOfPerson)).FirstOrDefault();

Для того, чтобы все объекты и подобъекты были заполнены в переменной "person", при условии, что соответствующие данные существуют.

спасибо огромное за любую помощь

David.

1 Ответ

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

Вы должны использовать Включить следующим образом:

Person person = localDatabase.People
                                .Include(p=> p.Addresses)
                                    .ThenInclude(add => add.AddressLine)
                                .Where(p => p.Id.Equals(idOfPerson)).FirstOrDefault();

Для более подробной информации: Загрузка связанных объектов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...