为何Entity Framework返回空集合而非null给导航属性?
问题解答:为何EF查询中关联集合返回空列表而非null
问题场景
我有一个Entity Framework模型,其中Organization类包含可空集合属性:
public List<MapInterestToVanType>? VanMapEventTypes { get; set; }
执行以下查询时:
var @event = await dbContext.Events .Include(e => e.ApptShifts) .Include(e => e.Occurrences) .Include(e => e.Owner) .Include(e => e.Parent) .FirstOrDefaultAsync(e => e.Id == updateEvent.EventId, stoppingToken);
返回的@event.Parent.VanMapEventTypes是一个空的List<MapInterestToVanType>(),而非预期的null。
但添加ThenInclude加载关联数据后:
var @event = await dbContext.Events .Include(e => e.ApptShifts) .Include(e => e.Occurrences) .Include(e => e.Owner) .Include(e => e.Parent) .ThenInclude(o => o.VanMapEventTypes) .FirstOrDefaultAsync(e => e.Id == updateEvent.EventId, stoppingToken);
@event.Parent.VanMapEventTypes会返回包含11条数据的预期集合。
疑惑点:第一次查询时为何VanMapEventTypes没有返回null?
相关类定义:
public class Organization { public int Id { get; private set; } public List<MapInterestToVanType>? VanMapEventTypes { get; set; } // 其他大量属性 public Organization(string uniqueId) { ArgumentException.ThrowIfNullOrEmpty(uniqueId); Enabled = true; Private = false; Deleted = false; UniqueId = uniqueId; // 初始化Address,因为数据在Campaign表中,逻辑上不会为null Address = new Address(); VanMapEventTypes = new List<MapInterestToVanType>(); } } public class Event { public int Id { get; private set; } public Organization Parent { get; set; } // 其他大量属性 } public class MapInterestToVanType { public int Id { get; private set; } public string InterestName { get; set; } public string VanEventTypeName { get; set; } }
原因分析
问题根源在Organization类的构造函数中——你显式执行了VanMapEventTypes = new List<MapInterestToVanType>()初始化操作。
当EF Core从数据库加载Organization实体时,会调用类的构造函数创建实例。此时即使没有通过Include/ThenInclude加载关联的VanMapEventTypes数据,构造函数已经把这个属性设置为一个空的列表对象,而非null。
只有当构造函数中没有初始化该集合,且EF Core未加载关联数据时,这个可空集合属性才会返回null。
内容的提问来源于stack exchange,提问作者David Thielen
相关产品推荐
相关产品推荐

