【问题标题】:Web application breaks when user added to role当用户添加到角色时,Web 应用程序中断
【发布时间】:2015-04-11 20:36:08
【问题描述】:

将 Identity 2.0 与 Web 表单项目结合使用。

我可以成功登录,并使用<allow users="<emailaddress>"/> 控制对页面的访问,但是当我将用户添加到 AspNetUserRoles 中的角色时,会导致应用程序返回此错误:

The specified cast from a materialized 'system.int32' type to the 'system.string' type is not valid

Visual Studio 在崩溃时引用的代码字符串是:

var user = manager.FindByName(Email.Text)

我该如何解决这个问题?

【问题讨论】:

  • 进入 .FIndByName 函数,看看哪个部分试图将 int 转换为字符串
  • 如果无法进入FindByName方法,可以使用ILSpy查看方法中发生了什么。
  • 我已经浏览了选项,所有内容都指向只需要一个字符串的 FindByName 方法。设置断点会给我关于传入值的信息,它是一个字符串,所以不是文本字段做一些奇怪的事情。而且它只影响存在于 AspNetUserRoles 表中的用户这一事实是另一个难题。

标签: javascript asp.net-identity-2


【解决方案1】:

发现问题。我们的 DB 编辑器更改了 AspNetRoles 表,以便 RoleID 字段自动递增,并且在此过程中,该字段从 NVARCHAR(256) 更改为 INT。改回来了,问题已经解决了。

【讨论】:

  • 我不知道是否建议您使用此解决方法。 NVARCHAR 和 INT 之间存在相当大的差异,特别是在数据使用和搜索能力方面。您可能应该考虑修复您的代码,以便它支持正确的 ID 字段
  • 这不是一种解决方法,它将数据库恢复到原始设置。我们在开始时将它从 NVARCHAR 移动到 INT,以便我们可以自动递增它,但列表是静态的,因此我们不需要经常调整它。此外,Identity 2.0 中还内置了一些方法,可以让我们在需要时通过前端创建角色。
  • 数据库最佳实践要求始终对 ID 使用 INT 和自动增量是有原因的,但我猜是否要遵循最佳实践是您的特权。
猜你喜欢
  • 2019-02-12
  • 2019-09-22
  • 2022-10-24
  • 2021-08-26
  • 2021-08-04
  • 2017-07-06
  • 1970-01-01
  • 2019-05-31
  • 1970-01-01
相关资源
最近更新 更多