【发布时间】:2019-04-27 22:15:55
【问题描述】:
我正在尝试在 Entity Framework Core 中加载一个相关的模式,但由于某种原因,当我没有在我的 Include() 调用中请求它时,会加载一个嵌套集合。
这是我的两个模型 -
Driver.cs
public partial class Driver : IBaseEntity
{
public short DriverId { get; set; }
public string Surname { get; set; }
public string Initials { get; set; }
public byte DriverStatusTypeId { get; set; }
public DriverStatusType DriverStatusType { get; set; }
}
DriverStatusType.cs
public partial class DriverStatusType
{
public DriverStatusType()
{
Drivers = new HashSet<Driver>();
}
public byte DriverStatusTypeId { get; set; }
public string DriverStatusTypeName { get; set; }
public string Description { get; set; }
public ICollection<Driver> Drivers { get; set; }
}
DriversService.cs
public class DriverService : IDriverService
{
public DriverService(MyContext context)
{
Context = context;
}
public MyContext Context { get; }
public async Task<IEnumerable<Driver>> GetAllDrivers()
{
var drivers = await Context
.Drivers
.Include(d => d.DriverStatusType)
.toListAsync();
return drivers;
}
public async Task<Driver> GetDriverById(int id)
{
var driver = await Context
.Drivers
.Include(d => d.DriverStatusType)
.Where(d => d.DriverId == id)
.FirstOrDefaultAsync();
return driver;
}
}
现在,当我从控制器调用 GetDriverById(int id) 方法时,我得到了预期的结果 -
{
"driverId": 1,
"surname": "Stark",
"initials": "T",
"driverStatusTypeId": 2,
"driverStatusType": {
"driverStatusTypeId": 2,
"driverStatusTypeName": "Available",
"description": "This driver is available",
"drivers": []
}
}
但是 GetAllDrivers() 方法返回嵌套的 drivers 集合,这意味着我要返回的数据是巨大的 -
[
{
"driverId": 1,
"surname": "Stark",
"initials": "T",
"displayText": "Tony Stark",
"driverStatusTypeId": 2,
"driverStatusType": {
"driverStatusTypeId": 2,
"driverStatusTypeName": "Available",
"description": "This driver is available",
"drivers": [
{
"driverId": 2,
"surname": "Rogers",
"initials": "S",
"driverStatusTypeId": 2
},
{
"driverId": 3,
"surname": "Romanoff",
"initials": "N",
"driverStatusTypeId": 2
},
{
"driverId": 4,
"surname": "Banner",
"initials": "B",
"driverStatusTypeId": 2
},
...
我认为预加载的想法是只包含您在 include 语句中指定的相关模型,但似乎情况并非如此。有人可以解释这里发生了什么吗?
【问题讨论】:
-
drivers[]是否已经在上一次调用的内存中?您的 DbContext 的范围是什么? EF为GetAllDrivers()生成的SQL查询是什么