Загрузить дочерний объект при выборке родительского объекта EFCore

У меня есть модель ниже. Как лучше всего загрузить родительский объект с дочерним объектом во время выборки из БД с помощью метода поиска?

Родительская организация:

public class Client
{
    public int Id { get; set; }

    public string LastName { get; set; }

    public string Gender { get; set; }

    public DateTime DateOfBirth { get; set; }

    public Address Address { get; set; }
}

Дочерняя сущность:

public class Address
{
    public int Id { get; set; }

    public string FirstLine { get; set; }

    public string SecondLine { get; set; }

    public string Province { get; set; }
}

Теперь, когда я пытаюсь получить данные с помощью метода Find, я получаю нулевой объект адреса, но когда я проверяю данные БД, существующие для этого идентификатора в дочерней таблице.

referenceContext.Clients.Find(client.Id);

Есть ли способ преодолеть это? Когда я извлекаю родительский объект, и в то же время значение дочернего объекта также загружается вместе с родителем.

Примечания: На данный момент, если я использовал Include(i => i.Address) тогда и потом, только я могу загрузить дочернюю сущность.

Я уже использую Include, но существует ли какой-либо другой вариант для загрузки дочернего объекта, если я получу родительский объект.

referenceContext.Clients.Where(c => c.IsActive.Equals(true))
                        .Include(i => i.Address).ToList();

Сведения о базе данных


person KARAN    schedule 08.01.2020    source источник


Ответы (3)


Как ты сказал:

Примечания. На данный момент, если я использовал Include(i => i.Address) тогда и только тогда, я могу загрузить дочерний объект.

Да! это лучший способ загрузки связанных данных в EF Core.

Вы далее сказали:

Я уже использую функцию "Включить", но существует ли какой-либо другой вариант для загрузки дочернего объекта, если я получу родительский объект?

Да! Есть! Это называется отложенной загрузкой. Чтобы включить отложенную загрузку, необходимо сделать свойство навигации виртуальным следующим образом:

public class Client
{
    public int Id { get; set; }

    public string LastName { get; set; }

    public string Gender { get; set; }

    public DateTime DateOfBirth { get; set; }

    public virtual Address Address { get; set; } // <-- Here it is
}

И вы должны зарегистрировать свой DbConext следующим образом:

services.AddDbContext<BloggingContext>(
    b => b.UseLazyLoadingProxies() // <-- Here is it is
          .UseSqlServer(myConnectionString));

UseLazyLoadingProxies() доступен в пакете NuGet Microsoft.EntityFrameworkCore.Proxies.

Примечание. Отложенную загрузку нельзя отключить для определенного запроса. Таким образом, использование нетерпеливой загрузки — это лучший способ загрузки связанных данных в EF Core.

person TanvirArjel    schedule 08.01.2020

В EF существует концепция под названием Eager Loading с использованием .Include.

Документы MS — Загрузка связанных данных — EF Core

скрипт .NET

using MyContext context = new MyContext();

IList<Client> clients =
    context.Clients
        .Include(c => c.Address)
        .Where(c => c.LastName == "patel")
        .ToList();
person Indar    schedule 08.01.2020
comment
Я забыл добавить это: использование Microsoft.EntityFrameworkCore; - person Rob Sedgwick; 23.01.2021

Вы можете использовать Include()

Linq-запрос

using (var context = new DBEntities())
{
   var result = (from c in context.Client.Include("Address")
            where c.IsActive
            select c).ToList();
}

Лямбда-выражение

using (var context = new DBEntities())
{
   var result = context.Client.Include(p => p.Address).Where(c => c.IsActive).ToList();
}
person Nguyễn Văn Phong    schedule 08.01.2020