简体   繁体   English

System.InvalidCastException:无法在 MySqlConnector.Core.Row.GetInt32(Int32 序号)处将 VarChar 转换为 Int32

[英]System.InvalidCastException: Can't convert VarChar to Int32 at MySqlConnector.Core.Row.GetInt32(Int32 ordinal)

I have an API whith a Controller called Token Controller which validates a user and gives a token.我有一个 API 和一个名为 Token Controller 的 Controller,它验证用户并提供令牌。

The problem is it was working just fine until now, I didn't change anything so I have no idea what happened.问题是直到现在它都工作得很好,我没有改变任何东西所以我不知道发生了什么。 Please help.请帮忙。

Here is the code of my Token controller这是我的令牌代码 controller

    public TokenController(IConfiguration configuration, ICrUserInfoService crUserInfoService, IPasswordService passwordService)
    {
        _configuration = configuration;
        _crUserInfoService = crUserInfoService;
        _passwordService = passwordService;
    }

    [HttpPost]
    public async Task<IActionResult> Authentication(UserLogin login)
    {
        //if it is a valid user 
        var validation = await IsValidUser(login);
        if (validation.Item1)
        {
            var token = GenerateToken(validation.Item2);
            return Ok(new { token });
        }

        return NotFound("Unvalid User");
    }
    private async Task<(bool, CrUserInfo)> IsValidUser(UserLogin login)
    {
        var user = await _crUserInfoService.GetLoginByCredentials(login);
        bool isValid;

        if (user == null)
        {
            isValid = false;
        }
        else
        {
            isValid = _passwordService.Check(user.Password, login.Password);
        }

        return (isValid, user);

    }

    private string GenerateToken(CrUserInfo user)
    {
        //Header
        var symmetricSecurityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Authentication:SecretKey"]));
        var signingCredentials = new SigningCredentials(symmetricSecurityKey, SecurityAlgorithms.HmacSha256);
        var header = new JwtHeader(signingCredentials);

        //Claims
        var claims = new[]
        {
            new Claim(ClaimTypes.Name, user.Username),
            new Claim("User", user.Displayname),
            new Claim(ClaimTypes.Role, user.Role.ToString()),
        };

        //Payload
        var payload = new JwtPayload
        (
            _configuration["Authentication:Issuer"],
            _configuration["Authentication:Audience"],
            claims,
            DateTime.Now,
            DateTime.Now.AddMinutes(30)
        );

        var token = new JwtSecurityToken(header, payload);

        return new JwtSecurityTokenHandler().WriteToken(token);
    }
}

As I said it was working just fine till now and here is the error正如我所说,到目前为止它工作得很好,这是错误

System.InvalidCastException: Can't convert VarChar to Int32
   at MySqlConnector.Core.Row.GetInt32(Int32 ordinal) in /_/src/MySqlConnector/Core/Row.cs:line 223
   at MySqlConnector.MySqlDataReader.GetInt32(Int32 ordinal) in /_/src/MySqlConnector/MySqlDataReader.cs:line 242
   at lambda_method23(Closure , QueryContext , DbDataReader , ResultContext , SingleQueryResultCoordinator )
   at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.AsyncEnumerator.MoveNextAsync()
   at Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.SingleOrDefaultAsync[TSource](IAsyncEnumerable`1 asyncEnumerable, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.SingleOrDefaultAsync[TSource](IAsyncEnumerable`1 asyncEnumerable, CancellationToken cancellationToken)
   at Crijoya.Infrastructure.Repositories.CrUserInfoRepository.GetLoginByCredentials(UserLogin login) in C:\Users\USER\source\repos\Api Crijoya\Crijoya.Data\Repositories\CrUserInfoRepository.cs:line 15
   at Crijoya.Core.Services.CrUserInfoService.GetLoginByCredentials(UserLogin userLogin) in C:\Users\USER\source\repos\Api Crijoya\Crijoya.Model\Services\CrUserInfoService.cs:line 20
   at Api_Crijoya.Controllers.TokenController.IsValidUser(UserLogin login) in C:\Users\USER\source\repos\Api Crijoya\Api Crijoya\Controllers\TokenController.cs:line 51
   at Api_Crijoya.Controllers.TokenController.Authentication(UserLogin login) in C:\Users\USER\source\repos\Api Crijoya\Api Crijoya\Controllers\TokenController.cs:line 40
   at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.TaskOfIActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask`1 actionResultValueTask)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeInnerFilterAsync>g__Awaited|13_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextExceptionFilterAsync>g__Awaited|25_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ExceptionContextSealed context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|24_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|19_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
   at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
   at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
   at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
   at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

I am not sure the issue is in the code as I said it was working minutes ago and giving a correct Token.我不确定问题出在代码中,因为我说它在几分钟前工作并提供了正确的令牌。 Please help I don't know how to approach this.请帮助我不知道如何处理这个问题。

EDIT :编辑

The repository of my entity CrUserInfo which contains the user and password我的实体 CrUserInfo 的存储库,其中包含用户和密码

public CrUserInfoRepository(db_crijoyaContext context) : base(context) { }

        public async Task<CrUserInfo> GetLoginByCredentials(UserLogin login)
        {
            return await _entities.FirstOrDefaultAsync(x => x.Username == login.User);
        }

Here is my entity CrUserInfo这是我的实体 CrUserInfo

public partial class CrUserInfo : BaseEntity
    {
       // public int IdUserInfo { get; set; }
        public int IdUser { get; set; }
        public string Displayname { get; set; }
        public string Username { get; set; }
        public string Password { get; set; }
        public RoleType Role { get; set; }

        public virtual CrUser IdUserNavigation { get; set; }
    }

My Dto entity我的 Dto 实体

public class CrUserInfoDto
    {
        public int Id { get; set; }
        public int IdUser { get; set; }
        public string Displayname { get; set; }
        public string Username { get; set; }
        public string Password { get; set; }
        public RoleType Role { get; set; }
    }

My database我的数据库

在此处输入图像描述

在此处输入图像描述

Here is the script这是脚本

CREATE TABLE `cr_userInfo` (
  `id_userInfo` int(6) unsigned NOT NULL AUTO_INCREMENT,
  `id_user` int(6) unsigned NOT NULL,
  `displayname` varchar(50) NOT NULL,
  `username` varchar(50) NOT NULL,
  `password` varchar(255) NOT NULL,
  `role` varchar(30) NOT NULL,
  PRIMARY KEY (`id_userInfo`) USING BTREE,
  UNIQUE KEY `id_user` (`id_user`) USING BTREE,
  CONSTRAINT `cr_userInfo_ibfk_1` FOREIGN KEY (`id_user`) REFERENCES `cr_user` (`id_user`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8

This is what it did before it stopped working这是它停止工作之前所做的

在此处输入图像描述

在此处输入图像描述

ONMODELCREATING CODE:模型创建代码:

modelBuilder.Entity<CrUser>(entity =>
            {
                entity.HasKey(e => e.Id)
                    .HasName("PRIMARY");

                entity.ToTable("cr_user");

                entity.HasIndex(e => e.IdCompany, "company");

                entity.Property(e => e.Id)
                    .HasColumnType("uint(6) unsigned")
                    .HasColumnName("id_user");

                entity.Property(e => e.Active)
                    .HasColumnType("tinyint(1) unsigned")
                    .HasColumnName("active")
                    .HasDefaultValueSql("'1'");

                entity.Property(e => e.IdCompany)
                    .HasColumnType("int(6) unsigned")
                    .HasColumnName("id_company");

                entity.Property(e => e.Warehouse)
                    .HasColumnType("int(6)")
                    .HasColumnName("warehouse")
                    .HasDefaultValueSql("'NULL'");

                entity.HasOne(d => d.IdCompanyNavigation)
                    .WithMany(p => p.CrUsers)
                    .HasForeignKey(d => d.IdCompany)
                    .OnDelete(DeleteBehavior.ClientSetNull)
                    .HasConstraintName("cr_user_ibfk_1");
            });

            modelBuilder.Entity<CrUserInfo>(entity =>
            {
                entity.HasKey(e => e.Id)
                    .HasName("PRIMARY");

                entity.ToTable("cr_userInfo");

                entity.HasIndex(e => e.IdUser, "id_user")
                    .IsUnique();

                entity.Property(e => e.Id)
                    .HasColumnType("uint(6) unsigned")
                    .HasColumnName("id_userInfo");

                entity.Property(e => e.Displayname)
                    .IsRequired()
                    .HasMaxLength(50)
                    .HasColumnName("displayname");

                entity.Property(e => e.IdUser)
                    .HasColumnType("int(6) unsigned")
                    .HasColumnName("id_user");

                entity.Property(e => e.Password)
                    .IsRequired()
                    .HasMaxLength(255)
                    .HasColumnName("password");

                entity.Property(e => e.Role)
                    .IsRequired()
                    .HasMaxLength(30)
                    .HasColumnName("role");

                entity.Property(e => e.Username)
                    .IsRequired()
                    .HasMaxLength(50)
                    .HasColumnName("username");

                entity.HasOne(d => d.IdUserNavigation)
                    .WithOne(p => p.CrUserInfo)
                    .HasForeignKey<CrUserInfo>(d => d.IdUser)
                    .HasConstraintName("cr_userInfo_ibfk_1");
            });

You will have to update your OnModelCreating code from this:您将必须从此更新您的OnModelCreating代码:

entity.Property(e => e.Role)
    .IsRequired()
    .HasMaxLength(30)
    .HasColumnName("role");

To indicate that it should be string :表明它应该是string

entity.Property(e => e.Role)
    .IsRequired()
    .HasMaxLength(30)
    .HasColumnName("role")
    .HasConversion<string>();

According to the documentation , this should automatically convert between the database varchar type and the RoleType in C#:根据文档,这应该会自动在数据库varchar类型和RoleType中的 RoleType 之间进行转换:

For example, enum to string conversions are used as an example above, but EF Core will actually do this automatically when the provider type is configured as string using the generic type of HasConversion :例如,上面使用枚举到字符串的转换作为示例,但当使用泛型类型HasConversion将提供程序类型配置为字符串时,EF Core 实际上会自动执行此操作:

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM