首页 文章

自定义ASP.NET核心标识表

提问于
浏览
1

当man在asp.net core 2中自定义Identity类时,表之间的关系不会自动创建 .

如何以最简单的方式创建表之间的关系?

User class:

public class User : IdentityUser<int>
{
    // codes
}

Role class:

public class Role : IdentityRole<int>
{
    public Role() : base()
    {

    }
    public Role(string roleName) : base(roleName)
    {

    }
}

RoleClaim class:

public class RoleClaim : IdentityRoleClaim<int> { }

UserClaim class:

public class UserClaim : IdentityUserClaim<int> { }

UserLogin class:

public class UserLogin : IdentityUserLogin<int> { }

UserRole class:

public class UserRole : IdentityUserRole<int> { }

UserToken class:

public class UserToken : IdentityUserToken<int> { }

custom Identity without relations between tables

I want to have same as this relations between my tables:

Default Identity Table

2 回答

  • 4

    我已经通过在 UserRoleUserClaimUserRoleUserLoginRoleClaimUserToken 类以及 ApplicationDbContext 类中编写了一些代码来定义表的关系 .

    Role class:

    public class Role : IdentityRole<int>
    {
        public Role() : base()
        {
    
        }
        public Role(string roleName) : this()
        {
            Name = roleName;
        }
    
        public virtual ICollection<UserRole> Users { get; set; }
        public virtual ICollection<RoleClaim> Claims { get; set; }
    }
    

    RoleClaim class:

    public class RoleClaim : IdentityRoleClaim<int>
    {
        public virtual Role Role { get; set; }
    }
    

    User class:

    public class User : IdentityUser<int>
    {
        public virtual ICollection<UserToken> UserTokens { get; set; }
    
        public virtual ICollection<UserRole> Roles { get; set; }
    
        public virtual ICollection<UserLogin> Logins { get; set; }
    
        public virtual ICollection<UserClaim> Claims { get; set; }
    }
    

    UserClaim class:

    public class UserClaim : IdentityUserClaim<int>
    {
        public virtual User User { get; set; }
    }
    

    UserLogin class:

    public class UserLogin : IdentityUserLogin<int>
    {
        public virtual User User { get; set; }
    }
    

    UserRole class:

    public class UserRole : IdentityUserRole<int>
    {
        public virtual User User { get; set; }
        public virtual Role Role { get; set; }
    }
    

    UserToken class:

    public class UserToken : IdentityUserToken<int>
    {
        public virtual User User { get; set; }
    }
    

    ApplicationDbContext class:

    public class ApplicationDbContext : IdentityDbContext<User, Role, int, UserClaim, UserRole, UserLogin, RoleClaim, UserToken>
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
        {
    
        }
    
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
    
            modelBuilder.Entity<RoleClaim>(builder =>
            {
                builder.HasOne(roleClaim => roleClaim.Role).WithMany(role => role.Claims).HasForeignKey(roleClaim => roleClaim.RoleId);
                builder.ToTable("RoleClaim");
            });
            modelBuilder.Entity<Role>(builder =>
            {
                builder.ToTable("Role");
            });
            modelBuilder.Entity<UserClaim>(builder =>
            {
                builder.HasOne(userClaim => userClaim.User).WithMany(user => user.Claims).HasForeignKey(userClaim => userClaim.UserId);
                builder.ToTable("UserClaim");
            });
            modelBuilder.Entity<UserLogin>(builder =>
            {
                builder.HasOne(userLogin => userLogin.User).WithMany(user => user.Logins).HasForeignKey(userLogin => userLogin.UserId);
                builder.ToTable("UserLogin");
            });
            modelBuilder.Entity<User>(builder =>
            {
                builder.ToTable("User");
            });
            modelBuilder.Entity<UserRole>(builder =>
            {
                builder.HasOne(userRole => userRole.Role).WithMany(role => role.Users).HasForeignKey(userRole => userRole.RoleId);
                builder.HasOne(userRole => userRole.User).WithMany(user => user.Roles).HasForeignKey(userRole => userRole.UserId);
                builder.ToTable("UserRole");
            });
            modelBuilder.Entity<UserToken>(builder =>
            {
                builder.HasOne(userToken => userToken.User).WithMany(user => user.UserTokens).HasForeignKey(userToken => userToken.UserId);
                builder.ToTable("UserToken");
            });
        }
    }
    

    你可以在这张图片中看到结果:
    CustomIdentityTables

  • 0

    IdentityDbContext 的泛型类型重载 . 如果您重新定制了所有内容,那么您将需要最广泛的重载:

    public class MyContext : IdentityDbContext<User, CustomRole, int, CustomUserClaim, CustomUserRole, CustomUserLogin, CustomRoleClaim, CustomUserLogin>
    

相关问题