.NET 7查询数据库时触发Nullable Object must have a value异常求助
解决方案
问题出在左连接后,无匹配订单时数据库返回的NULL无法映射到匿名类型中的非可空值类型字段,EF Core在枚举结果时会抛出"Nullable object must have a value"异常。
修改方式1:将匿名类型的字段改为可空类型
把匿名类型里的非可空值类型(比如Guid、int)声明为可空版本,确保数据库返回NULL时能正常映射:
var query = from c in dbContext.Customers from o in dbContext.Orders .Select(o => new { Id = (Guid?)o.Id, Number = (int?)o.Number }) .Where(o => o.CustomerId == c.Id) .DefaultIfEmpty() select new { Customer = c, Order = o }; var result = await query.ToListAsync();
修改方式2:使用导航属性(更简洁)
如果Customer实体已配置Orders导航属性,直接用导航属性做左连接,再选择需要的字段,EF Core会自动处理可空映射:
var query = from c in dbContext.Customers from o in c.Orders.DefaultIfEmpty() select new { Customer = c, Order = o == null ? null : new { o.Id, o.Number } }; var result = await query.ToListAsync();
为什么之前的尝试无效?
- 第一种尝试里的
o != null判断无法被EF Core正确翻译为SQL,数据库层面不会执行这个逻辑,依然会返回NULL值; - 第二种尝试用
Order实体而非匿名类型,当无订单时返回null,但如果Order实体的字段是非可空类型,EF依然会遇到NULL映射非可空的问题; - 第三种尝试在
select阶段判空,但此时EF已经完成数据库查询到内存对象的映射,异常已经在枚举时抛出,这个判断无法提前拦截数据库层面的NULL映射问题。
内容的提问来源于stack exchange,提问作者Dan Van
相关产品推荐
相关产品推荐

