【问题标题】:.NET Core how to override/extend IdentityUserRole and IdentityUserClaim.NET Core 如何覆盖/扩展 IdentityUserRole 和 IdentityUserClaim
【发布时间】:2019-06-26 08:54:29
【问题描述】:

我正在尝试用我自己的名为 UserRoles 的类替换默认的 IdentityUserRole 类。到目前为止我做了什么:

[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:无法为 'IdentityUserRole',因为此类型不包含在 上下文模型。 Microsoft.EntityFrameworkCore.Internal.InternalDbSet.get_EntityType()

IdentityUserClaim 也会发生这种情况。

【问题讨论】:

  • 提示:如果您已经在使用entitiy.ToTable,则不必使用[Table]。
  • 我这样做是因为当我引用这个 dll 时,其他应用程序似乎无法检测到它的架构

标签: c# asp.net .net asp.net-mvc asp.net-core


【解决方案1】:

在 DbContext 类上继承 IdentityDbContext 时,应指定新模型 UserRole。

像这样。

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

如您所见,我用 UserRole 替换了 IdentityUserRole,因为我想覆盖它。

【讨论】:

    【解决方案2】:

    如果你查看 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; }
    }
    

    【讨论】:

    • 您好,感谢您的回答。但是,当我执行迁移时出现此错误:CREATE UNIQUE INDEX 语句终止,因为为对象名称“dbo.AspNetRoles”和索引名称“RoleNameIndex”找到了重复键。重复键值为 (SYSTEMADMINISTRATOR)。声明已终止。
    猜你喜欢
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    相关资源
    最近更新 更多