c# - 我从 .NET 5 升级到 .NET 6,现在从 LINQ 查询中获取 SqlNullValueException
问题描述
我刚刚将一个项目从 .NET 5 升级到 .NET 6 预览版并开始使用 Visual Studio 2022。但是我得到了一个我以前没有得到的 SqlNullValueException。这对我来说没有意义。
这是 LINQ 查询:
var clients = _dbContext.AppUserAppUsers
.Where(x => x.AppUserParentId == designerId
&& x.ChildAppUser.AppUserRole == AppUserRole.Client)
.Include(x => x.ChildAppUser.Profile)
.Select(x => x.ChildAppUser)
.AsNoTracking();
return clients.ToList();
AppUserAppUsers 实体是 AppUsers 的多对多模型。我正在使用 Table-per-hierarchy 模式 所以我有 AppUserBase 抽象类,并且 DesignerModel 和 ClientModel 都扩展了该类。
public class AppUserAppUser
{
public int AppUserParentId { get; set; }
public int AppUserChildId { get; set; }
public bool Active { get; set; }
public AppUserBase ParentAppUser { get; set; }
public AppUserBase ChildAppUser { get; set; }
}
同样,所有这些在 .NET 5 中都能完美运行!
对 ToList() 的调用会引发此异常:
System.Data.SqlTypes.SqlNullValueException
HResult=0x80131931
Message=Data is Null. This method or property cannot be called on Null values.
Source=Microsoft.Data.SqlClient
StackTrace:
at Microsoft.Data.SqlClient.SqlBuffer.ThrowIfNull()
at Microsoft.Data.SqlClient.SqlBuffer.get_String()
at Microsoft.Data.SqlClient.SqlDataReader.GetString(Int32 i)
at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.Enumerator.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at Design2WorkroomApi.Repository.AppUserRepository.GetClientsByDesignerId(Int32 designerId) in C:\Users\davew\source\repos\Design2WorkroomApi\Design2WorkroomApi\Repository\AppUserRepository.cs:line 65
at Design2ClientAPI.Controllers.ClientsController.GetClientsByDesignerId(Int32 designerId) in C:\Users\davew\source\repos\Design2WorkroomApi\Design2WorkroomApi\Controllers\ClientsController.cs:line 56
at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.SyncActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeActionMethodAsync()
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeNextActionFilterAsync()
如果我取出 Include 和 Select 调用,这工作正常。但是任何一个和 LINQ 语句都返回 null。
在 .NET 5 版本中,具有相同参数的相同方法可以正常工作。而且我之前多次使用过类似的代码,没有任何问题。
显然,.NET 6 中的某些内容已更改为导致此问题,但我不知道它是什么。
这是我的 Entity Framework Core 包。在升级这些软件包之前,我遇到了同样的问题。
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="6.0.0-rc.2.21480.10" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.0-rc.2.21480.5" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.0-rc.2.21480.5" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.0-rc.2.21480.5">
解决方案
删除.Include()
,在这种特殊情况下不需要它,它可能会导致您遇到的错误。
新查询应该看起来像:
var clients = _dbContext.AppUserAppUsers
.Where(x => x.AppUserParentId == designerId
&& x.ChildAppUser.AppUserRole == AppUserRole.Client)
.Select(x => x.ChildAppUser)
.AsNoTracking();
推荐阅读
- sql - SQL 在日期范围之间没有值时显示 0 值
- msbuild - 您的项目没有引用“.NETPortable,Version=v4.5,Profile=Profile78”
- spring-boot - 如何使存储库保存与 Spring Boot 同步
- java - 了解泛型方法返回类型
- c++ - 在 C++ 中,如何将参数添加到“Args&&... args”参数列表?
- audio - 如何将 5.1 .flac 音轨添加到已经有 3 个音轨的 .ts 文件中?
- git - 如何在带有 Git 存储库的 TFS 中查看用户的签入历史记录
- git - Git - 是否可以添加标签并将其作为提交?就像在 Mercurial 中一样
- bash - 使用 bash 从 Txt 文件设置用户名和密码
- java - 运行 URI 时从 rest 服务获取重复值输出