asp.net - 自定义 ASP.NET Core 身份表

标签 asp.net asp.net-core asp.net-identity asp.net-core-2.0 entity-framework-migrations

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

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

用户类别:

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

角色类别:

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

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

    }
}

RoleClaim 类:

public class RoleClaim : IdentityRoleClaim<int> { }

UserClaim 类:

public class UserClaim : IdentityUserClaim<int> { }

UserLogin 类:

public class UserLogin : IdentityUserLogin<int> { }

UserRole 类:

public class UserRole : IdentityUserRole<int> { }

UserToken 类:

public class UserToken : IdentityUserToken<int> { }

custom Identity without relations between tables

我希望我的表之间有相同的关系:

Default Identity Table

最佳答案

我通过在UserRoleUserClaimUserRole中编写一些代码来定义表的关系>、UserLoginRoleClaimUserToken 类以及 ApplicationDbContext 类。

角色类别:

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 类:

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

用户类别:

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 类:

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

UserLogin 类:

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

UserRole 类:

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

UserToken 类:

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

ApplicationDbContext 类:

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

关于asp.net - 自定义 ASP.NET Core 身份表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49471748/

相关文章:

c# - 以编程方式为 .net 站点设置 "Convert to Application"选项

asp.net - 我是否需要输入控件(如复选框、文本框等)的 View 状态?

c# - 在 ASP.NET 中检测 HTML

c# - 环境变量没有像我希望的那样改变

asp.net-mvc-5 - 存储未实现 IUserLockoutStore<TUser>

c# - 使用 jwt 和许多角色进行基于角色的访问

asp.net - ASP.NET Web应用程序中的菜单

c# - 带有 include 的 PublishOptions 在调试 Asp.net Core 上不起作用

asp.net-core - ASP.NET Core 添加 View 参数名称路径不能为空错误

asp.net-mvc - 在 ASP.NET Identity 中,如何在登录后安全地缓存用户密码?