首页 文章

AddToRole和IdentityRole不是当前上下文模型的一部分

提问于
浏览
3

我正在使用Identity 2.1来处理我的asp.net应用程序中的用户角色 . 到目前为止,我创建了从IdentityDBContext扩展的新上下文,扩展了IdentityUser和IdentityRole以添加几个新字段 . 但是,每当我尝试使用UserManager即将 The entity type IdentityRole is not part of the model for the current context. 添加到特定角色的用户 . 所以用户 - 角色关系似乎有问题,到目前为止这是我的代码供参考:

User

public class User : IdentityUser{

    public string Name { get; set; }
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<User> manager, string authenticationType) {
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, authenticationType);
        // Add custom user claims here
        return userIdentity;
    }
}

Role

public partial class Role : IdentityRole
{
    public string Description { get; set; }
}

The DB Context

namespace Carbon.Models {

    public partial class CarbonEDM :  IdentityDbContext<User, Role, string, IdentityUserLogin, IdentityUserRole, IdentityUserClaim>{
        public CarbonEDM()
            : base("name=CarbonDB") {
        }

        public static CarbonEDM Create() {
            return new CarbonEDM();
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder) {

            base.OnModelCreating(modelBuilder);

            modelBuilder.Entity<User>().ToTable("Users", "dbo");
            modelBuilder.Entity<Role>().ToTable("Roles", "dbo");
            modelBuilder.Entity<IdentityUserRole>().ToTable("UserRoles", "dbo");
            modelBuilder.Entity<IdentityUserClaim>().ToTable("UserClaims", "dbo");
            modelBuilder.Entity<IdentityUserLogin>().ToTable("UserLogins", "dbo");
        }
    }
}

ApplicationUserManager

public class ApplicationUserManager : UserManager<User>
{
    public ApplicationUserManager(IUserStore<User> store)
        : base(store)
    {
    }

    public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) 
    {

        var manager = new ApplicationUserManager(new UserStore<User>(context.Get<CarbonEDM>()));
        // Configure validation logic for usernames
        manager.UserValidator = new UserValidator<User>(manager)
        {
            AllowOnlyAlphanumericUserNames = false,
            RequireUniqueEmail = true
        };

        // Configure validation logic for passwords
        manager.PasswordValidator = new PasswordValidator
        {
            RequiredLength = 6,
            RequireNonLetterOrDigit = false,
            RequireDigit = false,
            RequireLowercase = false,
            RequireUppercase = false,
        };

        // Configure user lockout defaults
        manager.UserLockoutEnabledByDefault = true;
        manager.DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(5);
        manager.MaxFailedAccessAttemptsBeforeLockout = 5;

        var dataProtectionProvider = options.DataProtectionProvider;
        if (dataProtectionProvider != null)
        {
            manager.UserTokenProvider = 
                new DataProtectorTokenProvider<User>(dataProtectionProvider.Create("ASP.NET Identity"));
        }
        return manager;
    }
}

最后,只要在迁移过程中出现错误:

protected override void Seed(Carbon.Models.CarbonEDM context)
    {

        DbContextTransaction transaction = null;
        transaction = context.Database.BeginTransaction();

        if (!context.Roles.Any()) {
            var roleStore = new RoleStore<Role>(context);
            var roleManager = new RoleManager<Role>(roleStore);

            roleManager.Create(new Role { Name = "Admin" });
            roleManager.Create(new Role { Name = "Control Unit Operator" });
            roleManager.Create(new Role { Name = "Lab Operator" });
            roleManager.Create(new Role { Name = "Production Engineer" });
            roleManager.Create(new Role { Name = "Production Operator" });
        }

        if (!context.Users.Any()) {
            var userStore = new UserStore<User>(context);
            var userManager = new ApplicationUserManager(userStore);

            var _user = new User {
                Email = "yehiasalam@live.com",
                PhoneNumber = "+20 12 23461340",
                Name = "Yehia A.Salam",
                UserName = "yehiasalam@live.com"
            };
            userManager.Create(_user, "pass@word");
            userManager.AddToRole(_user.Id, "Admin"); /* IdentityRole error here */

        }

        context.SaveChanges();
        transaction.Commit();


        base.Seed(context);
    }
}

对不起,很长的帖子,我试图包括一切 .

1 回答

  • 7

    好吧所以问题出在UserStore上,默认声明是

    public class UserStore<TUser> : UserStore<TUser, IdentityRole, string, IdentityUserLogin, IdentityUserRole, IdentityUserClaim>, IUserStore<TUser>, IUserStore<TUser, string>, IDisposable where TUser : Microsoft.AspNet.Identity.EntityFramework.IdentityUser {
    

    它具有显式声明的IdentityRole,而不是使用像TUser这样的通用符号,所以我们只需要创建从父UserStore扩展的另一个类:

    public class CarbonUserStore<TUser> : UserStore<TUser, Role, string, IdentityUserLogin, IdentityUserRole, IdentityUserClaim>, IUserStore<TUser>, IUserStore<TUser, string>, IDisposable where TUser : Microsoft.AspNet.Identity.EntityFramework.IdentityUser {
    
        public CarbonUserStore(DbContext context) :base(context) {}     }
    

    微软并不酷,我花了一天的时间试图让它等待 . 但是,它已添加到随vNext发送的身份包中(必须爱它开源):https://github.com/aspnet/Identity/blob/dev/src/Microsoft.AspNet.Identity.EntityFramework/UserStore.cs

    public class UserStore<TUser, TRole, TContext> : UserStore<TUser, TRole, TContext, string>
        where TUser : IdentityUser, new()
        where TRole : IdentityRole, new()
        where TContext : DbContext
    {
        public UserStore(TContext context, IdentityErrorDescriber describer = null) : base(context, describer) { }
    }
    

相关问题