为啥在获取 Users.ToListAsync() 不为空时会出现 SqlNullException

Posted

技术标签:

【中文标题】为啥在获取 Users.ToListAsync() 不为空时会出现 SqlNullException【英文标题】:Why am I getting SqlNullException when getting Users.ToListAsync() when it is not null为什么在获取 Users.ToListAsync() 不为空时会出现 SqlNullException 【发布时间】:2021-02-25 02:08:34 【问题描述】:

我一直在尝试找到解决此问题的方法,但似乎找不到。在这个控制器中,我试图获取要插入到用户角色视图模型中的用户列表,以检查用户的角色(管理员、学生或顾问)。但是我一直收到这个错误,我找不到下面错误中所述的 get_Int32() 是什么。

如果有人能帮我解决这个问题,不胜感激。

这是我的UserRolesController

public async Task<IActionResult> Index()

    var users = await _userManager.Users.ToListAsync(); //it gets the list of users - this one got error null
    var userRolesViewModel = new List<UserRolesViewModel>(); //the model

    foreach (ApplicationUser user in users)
    
        // inserting user data from database to view model
        var thisViewModel = new UserRolesViewModel
            
                UserId = user.Id,
                Email = user.Email,
                FirstName = user.FirstName,
                LastName = user.LastName,
                Roles = await GetUserRoles(user)
            ;
        userRolesViewModel.Add(thisViewModel);
    

    return View(userRolesViewModel);


private async Task<List<string>> GetUserRoles(ApplicationUser user)

    return new List<string>(await _userManager.GetRolesAsync(user));

我的UserRolesViewModel

public class UserRolesViewModel

    public string UserId  get; set; 
    public string FirstName  get; set; 
    public string LastName  get; set; 
    public string UserName  get; set; 
    public string Email  get; set; 
    public IEnumerable<string> Roles  get; set; 

这是我的用户表

CREATE TABLE [Identity].[User] 
(
    [Id]                   NVARCHAR(450)     NOT NULL,
    [UserName]             NVARCHAR(256)     NULL,
    [NormalizedUserName]   NVARCHAR(256)     NULL,
    [Email]                NVARCHAR(256)     NULL,
    [NormalizedEmail]      NVARCHAR(256)     NULL,
    [EmailConfirmed]       BIT               NOT NULL,
    [PasswordHash]         NVARCHAR(MAX)     NULL,
    [SecurityStamp]        NVARCHAR(MAX)     NULL,
    [ConcurrencyStamp]     NVARCHAR(MAX)     NULL,
    [PhoneNumber]          NVARCHAR(MAX)     NULL,
    [PhoneNumberConfirmed] BIT               NOT NULL,
    [TwoFactorEnabled]     BIT               NOT NULL,
    [LockoutEnd]           DATETIMEOFFSET(7) NULL,
    [LockoutEnabled]       BIT               NOT NULL,
    [AccessFailedCount]    INT               NOT NULL,
    [FirstName]            NVARCHAR(MAX)     NULL,
    [LastName]             NVARCHAR(MAX)     NULL,
    [ProfilePicture]       VARBINARY(MAX)    NULL,
    [UsernameChangeLimit]  INT               DEFAULT ((0)) NOT NULL,
    [Fullname]             NVARCHAR(50)      NULL,
    [Reg_no]               VARCHAR(50)       NULL,
    [Faculty]              VARCHAR(50)       NULL,
    [Programme]            VARCHAR(50)       NULL,
    [YearSem]              NVARCHAR(10)      NULL,
    [Cgpa]                 VARCHAR(10)       NULL,
    [Religion]             VARCHAR(50)       NULL,
    [Country]              VARCHAR(50)       NULL,
    [Race]                 VARCHAR(50)       NULL,
    [Address]              VARCHAR(100)      NULL,
    [Siblings]             INT               NULL,
    [BirthOrder]           INT               NULL,
    [Hobby]                NVARCHAR(50)      NULL,
    [Ambition]             NVARCHAR(50)      NULL,
    [Birthdate]            DATE              NULL,
    [About]                NVARCHAR(MAX)     NULL,

    CONSTRAINT [PK_User] 
        PRIMARY KEY CLUSTERED ([Id] ASC)
);
GO

CREATE NONCLUSTERED INDEX [EmailIndex]
ON [Identity].[User]([NormalizedEmail] ASC);
GO

CREATE UNIQUE NONCLUSTERED INDEX [UserNameIndex]
ON [Identity].[User]([NormalizedUserName] ASC) 
WHERE ([NormalizedUserName] IS NOT NULL);

我得到的错误:

Microsoft.Data.SqlClient.SqlBuffer.ThrowIfNull() Microsoft.Data.SqlClient.SqlBuffer.get_Int32() Microsoft.Data.SqlClient.SqlDataReader.GetInt32(int i) lambda_method(Closure, QueryContext, DbDataReader, ResultContext, int[], ResultCoordinator) Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable+AsyncEnumerator.MoveNextAsync() Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ToListAsync(IQueryable 源,CancellationToken cancelToken) Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ToListAsync(IQueryable 源,CancellationToken cancelToken) UserRolesController.cs 中的 UserManagement.MVC.Controllers.UserRolesController.Index() + var users = await _userManager.Users.ToListAsync();

Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor+TaskOfIActionResultExecutor.Execute(IActionResultTypeMapper 映射器,ObjectMethodExecutor 执行器,对象控制器,对象 [] 参数) System.Threading.Tasks.ValueTask.get_Result() System.Runtime.CompilerServices.ValueTaskAwaiter.GetResult() Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|12_0(ControllerActionInvoker 调用程序,ValueTask actionResultValueTask) Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|10_0(ControllerActionInvoker 调用程序,Task lastTask,State next,Scope 范围,对象状态,bool isCompleted) Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed 上下文) Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted) Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker。 g__Awaited|13_0(ControllerActionInvoker 调用者,Task lastTask,State next,Scope 范围,对象状态,bool isCompleted)

【问题讨论】:

我找不到您的 GetUserRoles 函数。没有它我们无能为力 嗨,我已经更新了控制器 @Sergey 中的代码 我不明白它是如何工作的 _userManager.GetRolesAsync(user));起初我以为 _userManager 是你的 dbContext。您能否显示 UserManager 类可能部分 - GetRolesAsync 和用户 【参考方案1】:

您在该行的 EntityFramework 中有异常:

var users = await _userManager.Users.ToListAsync();

根据堆栈跟踪,最可能的原因是 User 类具有 Integer 属性,但底层列在 DB 表中具有 NULL 值。您需要将 User 属性声明为可为空。

【讨论】:

谢谢!但是我如何使它可以为空? public int? property_name; 见System.Nullable

以上是关于为啥在获取 Users.ToListAsync() 不为空时会出现 SqlNullException的主要内容,如果未能解决你的问题,请参考以下文章

为啥获取 scrollIntoView 不是函数

Javascript:为啥不能在回调函数中获取变量?

为啥在解析 XML 时获取空节点值

为啥我无法获取 UIStatusBarSignalStrengthItemView?

为啥我不能在 python 中获取 sql 语句?

为啥Android有时无法获取位置