为啥在获取 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的主要内容,如果未能解决你的问题,请参考以下文章