![](/img/trans.png)
[英]Difference between Models and tables in mvc using entity framework(database first)
[英]AspNetUserRoles Table is not populated using Entity Framework Database First in MVC 5
如果要管理AspNetUsersRoles ,則必須進行以下修改。
刪除主鍵,實際上符合UserId和RoleId
在表中添加新的Id字段並檢查主鍵。
更新您的模型。
現在,您可以構建此實體並創建控制器和視圖以進行管理。
注意:請記住,通過在數據庫端更改此表的主鍵意味着您必須控制如何在應用程序端創建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.