ApplicationSignInManager类抛出无效的强制转换异常

时间:2014-11-29 10:41:16

标签: c# asp.net .net asp.net-mvc

这是从MVC5帐户控制器类中获取的代码(当您设置asp.net项目时,这是作为模板创建的) 但是,当我将以下参数传递给此代码行

model.UserName =“User1”,model.password =“Password1”,model.RememberMe = false,shouldLockout = false

 var result = await SignInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, shouldLockout: false); 

它引发了一个例外

  

无法将'System.Int32'类型的对象强制转换为'System.String'。

我不明白为什么上面的代码行认为参数在所有参数都是int时 字符串或布尔值。

任何人都可以寻求帮助?谢谢你提前。

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
    {
        if (!ModelState.IsValid)
        {
            return View(model);
        }
        // This doesn't count login failures towards account lockout
        // To enable password failures to trigger account lockout, change to shouldLockout: true
        var result = await SignInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, shouldLockout: false);   

    }

LoginViewModel类的代码

public class LoginViewModel
{
    [Required]
    [Display(Name = "User name")]
    public string UserName { get; set; }

    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [Display(Name = "Remember me?")]
    public bool RememberMe { get; set; }
}

1 个答案:

答案 0 :(得分:3)

在尝试解决同一场景中非常类似的错误(无法将system.guid类型的对象转换为类型system.string)时,我将问题追溯到已用于两个键列的数据类型角色表(AspNetRoles和AspNetUserRoles)。这些必须是 nvarchar 类型,而不是uniqueidentifier。

PasswordSignInAsync背后的SQL查询从AspNetUsers,AspNetUserRoles,AspNetUserClaims和AspNetUserLogins收集数据,因此我建议您检查所有这些表中的关键列类型是否与此数据将映射到的预期实体相匹配。据我所知,这些应该如下:

  

AspNetUsers&gt; [Id] NVARCHAR(128)

     

AspNetRoles&gt; [Id] NVARCHAR(128)

     

AspNetUserRoles&gt; [UserId] NVARCHAR(128),[RoleId] NVARCHAR(128)

     

AspNetUserClaims&gt; [Id] INT

     

AspNetUserLogins&gt; [UserId] NVARCHAR(128)