c# - System.Data.SqlClient.SqlException : 'Invalid column name ' ApplicationRoleId'. '

标签 c# asp.net-mvc asp.net-core-2.0

我正在开发基于 ASP.net Core 2.0 的项目。我创建了 ApplicationRoleApplicationUser 类。当我运行我的项目时,我已经编写了一段用于制作角色的代码片段我遇到了这个错误:

System.Data.SqlClient.SqlException: 'Invalid column name 'ApplicationRoleId'.

但是我在 ASP.net Core 1.1 中使用的相同代码没有任何问题。

我认为这行代码有问题:

lineNumberOfUsers = r.Users.Count

因为当我评论这个代码项目时工作正常,但是我需要每个角色的用户数。

Controller :

public class ApplicationRoleController : Controller
{
    private readonly UserManager<ApplicationUser> _userManager;
    private readonly RoleManager<ApplicationRole> _roleManager;

    public ApplicationRoleController(UserManager<ApplicationUser> userManager, RoleManager<ApplicationRole> roleManager)
    {
        _userManager = userManager;
        _roleManager = roleManager;
    }

    public IActionResult Index()
    {    
        List<ApplicationRoleViewModel> models = new List<ApplicationRoleViewModel>();
        models = _roleManager.Roles.Select(r => new ApplicationRoleViewModel
        {

            Id = r.Id,
            Name = r.Name,
            Description = r.Description,
            NumberOfUsers =  r.Users.Count 
        }).ToList();
        return View(models);
    }
}

型号

public class ApplicationRole : IdentityRole
{
    public string Description { get; set; }
    public virtual ICollection<ApplicationUser> Users { get; } = new List<ApplicationUser>(); 
}

我已经在 sql server profiler 中检查了 sql 查询。当我在 sql server 中运行 sql 查询时,我得到了同样的错误。

Invalid column name 'ApplicationRoleId'.

SELECT [r].[Id], [r].[Name], [r].[Description], (
    SELECT COUNT(*)
    FROM [AspNetUsers] AS [a]
    WHERE [r].[Id] = [a].[ApplicationRoleId]
) AS [NumberOfUsers]
FROM [AspNetRoles] AS [r]

最佳答案

不需要 ApplicationRole 类中的导航属性 Users

AspNetUsersAspNetRoles 表之间的关系作为外键存在于单独的表 AspNetUserRoles 中。因此,当您想要查询给定角色中的用户数时,您需要查询该表 AspNetUserRoles。为了实现这一点,您可以调用

_userManager.GetUsersInRoleAsync("roleName").Result.Count;

为此,请像这样实现您的 Index 操作方法:

public IActionResult Index()
{    
  List<ApplicationRoleViewModel> models = new List<ApplicationRoleViewModel>();
  models = _roleManager.Roles.Select(r => new ApplicationRoleViewModel
        {
            Id = r.Id,
            Name = r.Name,
            Description = r.Description
            // notice I am not assigning NumberOfUsers here.See further down...
        }).ToList();

        foreach(var m in models)
        {
          m.NumberOfUsers = _userManager.GetUsersInRoleAsync(m.Name).Result.Count;
        }
        return View(models);
}

希望这对您有所帮助。

关于c# - System.Data.SqlClient.SqlException : 'Invalid column name ' ApplicationRoleId'. ',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49292161/

相关文章:

c# - 如何画一条可选择的线?

c# - 为什么要使用 LINQ 表达式?

c# - Asp.net MVC 角色管理器

c# - 如何正确读取 Interlocked.Increment'ed int 字段?

C# WPF - 长时间点击按钮操作

c# - 自定义 ASP.NET Web API 输出

javascript - 加载部分 View 后触发 JavaScript

c# - 从动态导入的 DLL 加载 EF Core 2 DbContext

c# - ASP.NET 核心 2 : Ajax calls to API with [Authorize] fail the preflight request

jwt - asp.net core 2.0登录请求的400状态