在获取父实体 EFCore 时加载子实体

KAR*_*RAN 4 c# entity-framework entity-framework-core blazor ef-core-3.0

我有以下型号。在使用 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; }
}
Run Code Online (Sandbox Code Playgroud)

子实体:

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

    public string FirstLine { get; set; }

    public string SecondLine { get; set; }

    public string Province { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试使用 Find 方法获取数据时,我得到的地址实体为空,但是当我在 Child 表中也存在该 ID 的数据库数据时。

referenceContext.Clients.Find(client.Id);
Run Code Online (Sandbox Code Playgroud)

有没有办法克服这个问题?当我获取父对象时,同时子实体的值也与父对象一起加载。

注意:截至目前,如果我使用Include(i => i.Address)then,然后,只有我能够加载子实体。

我已经使用了 Include 但是如果我得到父实体,是否还有其他选项可以加载子实体。

referenceContext.Clients.Where(c => c.IsActive.Equals(true))
                        .Include(i => i.Address).ToList();
Run Code Online (Sandbox Code Playgroud)

数据库详细信息

Tan*_*jel 8

如你所说:

注意:到目前为止,如果我使用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
}
Run Code Online (Sandbox Code Playgroud)

您必须DbConext按如下方式注册:

services.AddDbContext<BloggingContext>(
    b => b.UseLazyLoadingProxies() // <-- Here is it is
          .UseSqlServer(myConnectionString));
Run Code Online (Sandbox Code Playgroud)

UseLazyLoadingProxies()方法可在Microsoft.EntityFrameworkCore.Proxies nuget 包中找到。

注意:您无法禁用特定查询的延迟加载。所以使用Eager Loading是EF Core中加载相关数据的最佳方式。


Ind*_*dar 5

在 EF 中,有一个叫做Eager Loadingusing的概念.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();
Run Code Online (Sandbox Code Playgroud)