.NET Core, как переопределить / расширить IdentityUserRole и IdentityUserClaim - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь заменить класс IdentityUserRole по умолчанию своим собственным UserRoles.Что я сделал до сих пор:

[Table("IdentityUserRole", Schema = "ManagementStudio")]
public class UserRoles : IdentityUserRole<string>
{
    [Key]
    public string Id { get; set; }
    [ForeignKey("Users")]
    public override string UserId { get; set; }
    public virtual ApplicationUsers Users { get; set; }
    [ForeignKey("Roles")]
    public override string RoleId { get; set; }
    public virtual Roles Roles { get; set; }
}

В моем классе DbContext:

public DbSet<UserRoles> UserRoles{ get; set; }

В моем onModelBuilding

modelBuilder.Entity<UserRoles>()
            .ToTable("IdentityUserRole", schema: "ManagementStudio");

Это ошибка, которую я получаю, когда япопробуйте войти:

Произошло необработанное исключение при обработке запроса.InvalidOperationException: Невозможно создать DbSet для 'IdentityUserRole', поскольку этот тип не включен в модель для контекста.Microsoft.EntityFrameworkCore.Internal.InternalDbSet.get_EntityType ()

Это также происходит для IdentityUserClaim.

Ответы [ 2 ]

0 голосов
/ 28 июня 2019

Если вы посмотрите в определение IdentityUserRole, вы обнаружите, что у него уже есть первичные ключи

public class IdentityUserRole<TKey> where TKey : IEquatable<TKey>
{
    public IdentityUserRole();

    //
    // Summary:
    //     Gets or sets the primary key of the user that is linked to a role.
    public virtual TKey UserId { get; set; }
    //
    // Summary:
    //     Gets or sets the primary key of the role that is linked to the user.
    public virtual TKey RoleId { get; set; }
}

мы должны переопределить реализацию роли пользователя.Теперь, если вы видите код, вы увидите, что мы можем переопределить его.Итак, я сделал это:

 public class MyDbContext : IdentityDbContext<
    User,
    Role,
    string,
    IdentityUserClaim<string>,
    UserRole,
    IdentityUserLogin<string>,
    IdentityRoleClaim<string>,
    IdentityUserToken<string>>

// И это для переопределения первичных ключей в UserRole:

 protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    modelBuilder.Entity<UserRole>(userRole =>
    {
        userRole.HasKey(pr => new
        {
            pr.UserId,
            pr.RoleId,
            pr.ClientId
        });
    }
}

После того, как мы переопределим контекст базы данных, мы можемиспользуйте пользовательское TUserRole, например, вот так:

   public class UserRole : IdentityUserRole<string>
{
    [Required, StringLength(36)]
    public string ClientId { get; set; }
    [ForeignKey("ClientId")]
    public virtual Client Client { get; set; }
    public virtual User User { get; set; }
    public virtual Role Role { get; set; }
}
0 голосов
/ 28 июня 2019

Вы должны указать новую модель UserRole при наследовании IdentityDbContext в вашем классе DbContext.

Вот так.

public class ApplicationDbContext : IdentityDbContext<User, Role, Guid, IdentityUserClaim<Guid>, UserRole , IdentityUserLogin<Guid>, IdentityRoleClaim<Guid>, IdentityUserToken<Guid>>
{
    ...
}

как вы можете видеть, я заменил IdentityUserRole на UserRole, так как хочу переопределить его.

...