簡體   English   中英

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

[英]AspNetUserRoles Table is not populated using Entity Framework Database First in MVC 5

在我的項目中,我試圖使用Entity Framework檢索MVC 5中的所有用戶及其角色。

首先使用Database設置DBContext。 但是AspNetUserRoles表沒有自動填充並且AspNetUserAspNetRole之間的關系是多對多的令人 厭煩

以下是截圖的鏈接。

圖片

有人能給我一些暗示嗎? 非常感謝。

如果要管理AspNetUsersRoles ,則必須進行以下修改。

  1. 刪除主鍵,實際上符合UserId和RoleId

  2. 在表中添加新的Id字段並檢查主鍵。

  3. 更新您的模型。

在此輸入圖像描述

現在,您可以構建此實體並創建控制器和視圖以進行管理。

注意:請記住,通過在數據庫端更改此表的主鍵意味着您必須控制如何在應用程序端創建AspNetUserRoles記錄,考慮到您現在可以在表上具有記錄冗余,例如:MyRoles = 1(PK ),UserID = 1,RoleID = 1,Comment = User1是Admin MyRoles = 2(PK),UserID = 1,RoleID = 2,Comment = User1再次是Admin

這意味着相同,所以在AspNetUserRoles創建時管理這個邏輯!

我假設沒有問題,你根本看不到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

希望這會幫助你。

因為在您在種子方法中明確添加角色之前,默認情況下不會播種角色
閱讀有關Asp.Net Identity模塊的信息
http://www.asp.net/identity
http://www.codeproject.com/Articles/762428/ASP-NET-MVC-and-Identity-Understanding-the-Basics

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM