Загрузка дочерней сущности в выборку родительской сущности EFCore - PullRequest
1 голос
/ 08 января 2020

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

Родительская сущность:

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; }
}

Child Entity:

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

    public string FirstLine { get; set; }

    public string SecondLine { get; set; }

    public string Province { get; set; }
}

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

referenceContext.Clients.Find(client.Id);

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

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

Я уже использую «Включить», но есть ли другой вариант для загрузки дочерней сущности, если я получаю родительскую сущность.

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

DB Deatils

Ответы [ 3 ]

1 голос
/ 08 января 2020

Как вы сказали:

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

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

Вы также сказали:

Я уже использую «Включить», но есть ли другие варианты? загрузить дочернюю сущность, если я получу родительскую сущность.

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

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() метод доступен в пакете Microsoft.EntityFrameworkCore.Proxies .

Примечание. Вы не можете отключить отложенную загрузку для определенный запрос. Поэтому использование Стремительная загрузка - лучший способ загрузить связанные данные в EF Core.

1 голос
/ 08 января 2020

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

MS Docs - Загрузка связанных данных - EF Core

. NET Скрипка

using MyContext context = new MyContext();

IList<Client> clients =
    context.Clients
        .Include(c => c.Address)
        .Where(c => c.LastName == "patel")
        .ToList();
0 голосов
/ 08 января 2020

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

Запрос 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();
}
...