在获取父实体 EFCore 时加载子实体
Load child entity on the fetch of the Parent entity EFCore
我有以下型号。在使用 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; }
}
子实体:
public class Address
{
public int Id { get; set; }
public string FirstLine { get; set; }
public string SecondLine { get; set; }
public string Province { get; set; }
}
现在,当我尝试使用 Find 方法获取数据时,我得到的地址实体为空,但是当我检查数据库数据时,该 ID 也存在于 Child table 中。
referenceContext.Clients.Find(client.Id);
有办法克服这个问题吗?当我获取父对象时,同时子实体的值也随父对象一起加载。
注意:截至目前,如果我使用 Include(i => i.Address)
然后,然后,只有我能够加载子实体。
我已经使用了 Include,但是如果我得到父实体,是否还有其他选项可以加载子实体。
referenceContext.Clients.Where(c => c.IsActive.Equals(true))
.Include(i => i.Address).ToList();
在 EF 中,有一个概念叫做 Eager Loading
使用 .Include
。
MS 文档 - Loading Related Data - EF Core
using MyContext context = new MyContext();
IList<Client> clients =
context.Clients
.Include(c => c.Address)
.Where(c => c.LastName == "patel")
.ToList();
您可以使用Include()
Linq 查询
using (var context = new DBEntities())
{
var result = (from c in context.Client.Include("Address")
where c.IsActive
select c).ToList();
}
Lambda 表达式
using (var context = new DBEntities())
{
var result = context.Client.Include(p => p.Address).Where(c => c.IsActive).ToList();
}
正如你所说:
Notes: As of now, if I used the Include(i => i.Address) then, and then, only I am able to load the child entity.
是的!这是在 EF Core 中加载相关数据的最佳方式。
你进一步说:
I already use the Include but is there any other option exist to load child entity if I get the parent entity.
是的!有!也就是所谓的Lazy loading。要启用延迟加载,您必须使导航 属性 虚拟 如下所示:
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 nuget 包中可用。
注意:您不能为某个查询禁用延迟加载。所以使用Eager loading是在EF Core中加载相关数据的最佳方式。
我有以下型号。在使用 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; }
}
子实体:
public class Address
{
public int Id { get; set; }
public string FirstLine { get; set; }
public string SecondLine { get; set; }
public string Province { get; set; }
}
现在,当我尝试使用 Find 方法获取数据时,我得到的地址实体为空,但是当我检查数据库数据时,该 ID 也存在于 Child table 中。
referenceContext.Clients.Find(client.Id);
有办法克服这个问题吗?当我获取父对象时,同时子实体的值也随父对象一起加载。
注意:截至目前,如果我使用 Include(i => i.Address)
然后,然后,只有我能够加载子实体。
我已经使用了 Include,但是如果我得到父实体,是否还有其他选项可以加载子实体。
referenceContext.Clients.Where(c => c.IsActive.Equals(true))
.Include(i => i.Address).ToList();
在 EF 中,有一个概念叫做 Eager Loading
使用 .Include
。
MS 文档 - Loading Related Data - EF Core
using MyContext context = new MyContext();
IList<Client> clients =
context.Clients
.Include(c => c.Address)
.Where(c => c.LastName == "patel")
.ToList();
您可以使用Include()
Linq 查询
using (var context = new DBEntities())
{
var result = (from c in context.Client.Include("Address")
where c.IsActive
select c).ToList();
}
Lambda 表达式
using (var context = new DBEntities())
{
var result = context.Client.Include(p => p.Address).Where(c => c.IsActive).ToList();
}
正如你所说:
Notes: As of now, if I used the Include(i => i.Address) then, and then, only I am able to load the child entity.
是的!这是在 EF Core 中加载相关数据的最佳方式。
你进一步说:
I already use the Include but is there any other option exist to load child entity if I get the parent entity.
是的!有!也就是所谓的Lazy loading。要启用延迟加载,您必须使导航 属性 虚拟 如下所示:
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 nuget 包中可用。
注意:您不能为某个查询禁用延迟加载。所以使用Eager loading是在EF Core中加载相关数据的最佳方式。