自定义 ASP.NET 核心身份表
Customizing ASP.NET Core Identity Tables
当人在 asp.net 核心 2 中自定义身份 classes 时,表之间的关系不会自动创建。
如何以最简单的方式创建表之间的关系?
用户class:
public class User : IdentityUser<int>
{
// codes
}
角色class:
public class Role : IdentityRole<int>
{
public Role() : base()
{
}
public Role(string roleName) : base(roleName)
{
}
}
角色声明class:
public class RoleClaim : IdentityRoleClaim<int> { }
用户声明class:
public class UserClaim : IdentityUserClaim<int> { }
用户登录class:
public class UserLogin : IdentityUserLogin<int> { }
用户角色class:
public class UserRole : IdentityUserRole<int> { }
用户令牌class:
public class UserToken : IdentityUserToken<int> { }
我想在我的表之间具有与此相同的关系:
有 IdentityDbContext
的泛型类型重载。如果您要自定义某些 类,您必须通过这些重载告诉 Identity 实际使用哪些实体。由于您要自定义几乎所有内容,因此您需要最广泛的重载:
public class MyContext : IdentityDbContext<User, CustomRole, int, CustomUserClaim, CustomUserRole, CustomUserLogin, CustomRoleClaim, CustomUserLogin>
我通过在User
、Role
、UserClaim
、UserRole
、UserLogin
、[=中编写一些代码来定义表的关系23=] 和 UserToken
class 和 ApplicationDbContext
class.
角色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; }
}
角色声明class:
public class RoleClaim : IdentityRoleClaim<int>
{
public virtual Role Role { get; set; }
}
用户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; }
}
用户声明class:
public class UserClaim : IdentityUserClaim<int>
{
public virtual User User { get; set; }
}
用户登录class:
public class UserLogin : IdentityUserLogin<int>
{
public virtual User User { get; set; }
}
用户角色class:
public class UserRole : IdentityUserRole<int>
{
public virtual User User { get; set; }
public virtual Role Role { get; set; }
}
用户令牌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");
});
}
}
您可以在这张图片中看到结果:
当人在 asp.net 核心 2 中自定义身份 classes 时,表之间的关系不会自动创建。
如何以最简单的方式创建表之间的关系?
用户class:
public class User : IdentityUser<int>
{
// codes
}
角色class:
public class Role : IdentityRole<int>
{
public Role() : base()
{
}
public Role(string roleName) : base(roleName)
{
}
}
角色声明class:
public class RoleClaim : IdentityRoleClaim<int> { }
用户声明class:
public class UserClaim : IdentityUserClaim<int> { }
用户登录class:
public class UserLogin : IdentityUserLogin<int> { }
用户角色class:
public class UserRole : IdentityUserRole<int> { }
用户令牌class:
public class UserToken : IdentityUserToken<int> { }
我想在我的表之间具有与此相同的关系:
有 IdentityDbContext
的泛型类型重载。如果您要自定义某些 类,您必须通过这些重载告诉 Identity 实际使用哪些实体。由于您要自定义几乎所有内容,因此您需要最广泛的重载:
public class MyContext : IdentityDbContext<User, CustomRole, int, CustomUserClaim, CustomUserRole, CustomUserLogin, CustomRoleClaim, CustomUserLogin>
我通过在User
、Role
、UserClaim
、UserRole
、UserLogin
、[=中编写一些代码来定义表的关系23=] 和 UserToken
class 和 ApplicationDbContext
class.
角色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; }
}
角色声明class:
public class RoleClaim : IdentityRoleClaim<int>
{
public virtual Role Role { get; set; }
}
用户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; }
}
用户声明class:
public class UserClaim : IdentityUserClaim<int>
{
public virtual User User { get; set; }
}
用户登录class:
public class UserLogin : IdentityUserLogin<int>
{
public virtual User User { get; set; }
}
用户角色class:
public class UserRole : IdentityUserRole<int>
{
public virtual User User { get; set; }
public virtual Role Role { get; set; }
}
用户令牌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");
});
}
}
您可以在这张图片中看到结果: