首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我从.NET 5升级到.NET 6,现在从LINQ获取SqlNullValueException

我从.NET 5升级到.NET 6,现在从LINQ获取SqlNullValueException
EN

Stack Overflow用户
提问于 2021-10-23 11:41:41
回答 1查看 116关注 0票数 1

我刚刚将一个项目从.NET 5升级到.NET 6预览版,并开始使用Visual Studio2022。但是我得到了一个我以前没有得到的SqlNullValueException。这对我来说没什么意义。

下面是LINQ查询:

代码语言:javascript
复制
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 pattern,所以我有AppUserBase抽象类,DesignerModel和ClientModel都扩展了该类。

代码语言:javascript
复制
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()的调用抛出此异常:

代码语言:javascript
复制
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中的某些变化导致了这种情况,但我不知道是什么原因。

以下是我的实体框架核心包。在升级这些包之前,我也遇到了同样的问题。

代码语言:javascript
复制
 <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">
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-23 14:25:37

删除.Include(),在这种特殊情况下不需要它,它可能会导致您得到的错误。

新的查询应该看起来像这样:

代码语言:javascript
复制
var clients = _dbContext.AppUserAppUsers
            .Where(x => x.AppUserParentId == designerId
                        && x.ChildAppUser.AppUserRole == AppUserRole.Client)
            .Select(x => x.ChildAppUser)
            .AsNoTracking();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69687802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档