在MVC 5中未使用Entity Framework Database First填充AspNetUserRoles表

时间:2014-05-24 09:38:09

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

在我的项目中,我试图使用Entity Framework检索MVC 5中的所有用户及其角色。

首先使用Database设置DBContext。但是,自动填充 AspNetUserRoles 表并且 AspNetUser AspNetRole 之间的关系是多对多的。

以下是截图的链接。

image

有人能给我一些暗示吗?非常感谢。

3 个答案:

答案 0 :(得分:5)

如果您想管理 AspNetUsersRoles ,您必须进行以下修改。

  1. 删除主键,实际上符合UserId和RoleId

  2. 在表格中添加新的ID字段并检查主键。

  3. 更新您的模型。

  4. enter image description here

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

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

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

答案 1 :(得分:2)

我认为没有问题,你根本看不到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

希望这会对你有所帮助。

答案 2 :(得分:-1)

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