【问题标题】:AspNetUserRoles Table is not populated using Entity Framework Database First in MVC 5AspNetUserRoles 表未在 MVC 5 中首先使用实体​​框架数据库填充
【发布时间】:2014-07-13 15:42:56
【问题描述】:

在我的项目中,我尝试使用实体框架检索 MVC 5 中的所有用户及其角色。

首先使用数据库设置 DBContext。但是AspNetUserRoles表没有自动填充,AspNetUserAspNetRole之间的关系是多对多的,让人厌烦。

下面是截图的链接。

谁能给我一些提示?非常感谢。

【问题讨论】:

  • 你能提供你的DBContext的sn-p吗?它是从 IdentityDbContext 派生的吗?
  • 我使用了 Mvc 5 自带的默认 asp.net 标识。步骤如下: 1. 使用 Mvc 模板在 VS2013 中创建一个 Mvc 5 项目。 2. 在新应用程序中注册用户,以便在 SQL Server 中创建默认身份表。 3. 使用创建的数据库添加一个新的 EF 数据项。 4.将所有表格添加到 EF 项中,该项​​返回上述屏幕截图中的结果图。希望这可以澄清问题。

标签: asp.net-mvc entity-framework asp.net-mvc-5


【解决方案1】:

因为默认情况下角色不会被播种,直到您在种子方法中明确添加它们
阅读有关 Asp.Net 身份模块的信息
http://www.asp.net/identity
http://www.codeproject.com/Articles/762428/ASP-NET-MVC-and-Identity-Understanding-the-Basics

【讨论】:

    【解决方案2】:

    如果要管理AspNetUsersRoles,必须进行如下修改。

    1. 去掉主键,其实是符合UserId和RoleId的

    2. 在表中添加一个新的Id字段,并像主键一样检查。

    3. 更新您的模型。

    现在您可以搭建这个实体并创建控制器和视图来管理它。

    注意:请记住,通过在数据库端更改此表的主键意味着您必须控制在应用程序端创建 AspNetUserRoles 记录的方式,考虑到您现在可能在表上具有记录冗余,例如: MyRoles=1 (PK), UserID=1, RoleID=1, Comment= User1 是管理员 MyRoles=2 (PK), UserID=1, RoleID=2, Comment= User1 再次成为管理员

    意思相同,所以在创建 AspNetUserRoles 时管理这个逻辑!

    【讨论】:

      【解决方案3】:

      我假设你在 EDMX 下根本看不到 AspNetUserRoles 表是没有问题的。

      您可以通过代码访问此表,并且在大多数情况下就足够了。

      通常在 ASP.NET MVC 5 下你有类似

      的东西
         public class AccountController : Controller
          {
              private ApplicationUserManager _userManager;
       ...
       public AccountController(ApplicationUserManager userManager, ApplicationSignInManager signInManager)
              {
      
                  UserManager = userManager;
      ...
       public ApplicationUserManager UserManager
              {
                  get
                  {
                      return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
                  }
                  private set
                  {
                      _userManager = value;
                  }
              }
      

      所以在Login 方法下你可以像这样获得用户角色

        [System.Web.Mvc.HttpPost]
              [System.Web.Mvc.AllowAnonymous]
              [ValidateAntiForgeryToken]
              public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
              {
      ...
       var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, false, shouldLockout: false);
                  switch (result)
                  {
                      case SignInStatus.Success:
                          {     
                              ApplicationUser user = UserManager.FindByName(model.Email);
      
                              var roles = (AppUserRoles[])Enum.GetValues(typeof(AppUserRoles));
                              foreach (var role in roles)
                              {
                                  if (UserManager.IsInRole(user.Id, role.ToString()) && role == AppUserRoles.Administrators)
                                  {
                                       // Do what you need here                                
      
                                      // logger.Info("Login attempt is success.");
      
                                      return RedirectToAction("Index", "Admin");
                                  }
      

      您还需要在代码中包含此枚举

      public enum AppUserRoles
          {
              Administrators = 1,
              Managers = 2,
              Users = 3,
              Others = 4
          }
      

      另一种方法是使用可在 EDMX 中使用的 STORED PROCEDURE。

      CREATE PROCEDURE GetUserRoleByUserId
          @UserId nvarchar(128) 
      AS
      BEGIN
          -- SET NOCOUNT ON added to prevent extra result sets from
          -- interfering with SELECT statements.
          SET NOCOUNT ON;
      
          SELECT [UserId],[RoleId] FROM [AspNetUserRoles] WHERE [UserId] LIKE @UserId
      END
      GO
      

      希望这会对你有所帮助。

      【讨论】:

        猜你喜欢
        • 2015-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-03
        • 1970-01-01
        • 1970-01-01
        • 2012-09-03
        相关资源
        最近更新 更多