.core 实体框架使用 IdentityRole 将自定义字段添加到 UsersRoles 实体

问题描述 投票:0回答:1

我正在将 .NET Core 与 MinimalAPI 和 EntityFramework 8 用于个人项目。为了管理注册和登录,我使用了开箱即用的身份管理。现在,我需要添加一些有关用户和角色之间关系的附加信息,而无需求助于自定义表,但不幸的是,我无法找到这方面的文档。

简而言之,UsersRole 实体应从以下位置转换:

CREATE TABLE [dbo].[UsersRoles](
    UserId nvarchar(450) NOT NULL,
    RoleId nvarchar(450) NOT NULL,
)

至:

CREATE TABLE [dbo].[UsersRoles](
    UserId nvarchar(450) NOT NULL,
    RoleId nvarchar(450) NOT NULL,
    CustomField1 nvarchar(450) NOT NULL,
    CustomField2 nvarchar(450) NOT NULL
)

有人可以帮助我处理这种情况吗? 预先感谢您。

entity-framework asp.net-core .net-core
1个回答
0
投票

定制模型

public class ApplicationUser : IdentityUser
{
    public virtual ICollection<IdentityUserClaim<string>> Claims { get; set; }
    public virtual ICollection<IdentityUserLogin<string>> Logins { get; set; }
    public virtual ICollection<IdentityUserToken<string>> Tokens { get; set; }
    public virtual ICollection<ApplicationUserRole> UserRoles { get; set; }
}
   
public class ApplicationRole : IdentityRole
{
    public virtual ICollection<ApplicationUserRole> UserRoles { get; set; }
}


public class ApplicationUserRole : IdentityUserRole<string>
{
    public string CustomField1 { get; set; }
    public string CustomField2 { get; set; }
    public virtual ApplicationUser User { get; set; }
    public virtual ApplicationRole Role { get; set; }
}

应用程序DbContext

public class ApplicationDbContext
    : IdentityDbContext<
        ApplicationUser, ApplicationRole, string,
        IdentityUserClaim<string>, ApplicationUserRole, IdentityUserLogin<string>,
        IdentityRoleClaim<string>, IdentityUserToken<string>>
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<ApplicationUser>(b =>
        {
            b.HasMany(e => e.Claims)
                .WithOne()
                .HasForeignKey(uc => uc.UserId)
                .IsRequired();

            // Each User can have many UserLogins
            b.HasMany(e => e.Logins)
                .WithOne()
                .HasForeignKey(ul => ul.UserId)
                .IsRequired();

            b.HasMany(e => e.Tokens)
                .WithOne()
                .HasForeignKey(ut => ut.UserId)
                .IsRequired();

            b.HasMany(e => e.UserRoles)
                .WithOne(e => e.User)
                .HasForeignKey(ur => ur.UserId)
                .IsRequired();
        });

        modelBuilder.Entity<ApplicationRole>(b =>
        {
            b.HasMany(e => e.UserRoles)
                .WithOne(e => e.Role)
                .HasForeignKey(ur => ur.RoleId)
                .IsRequired();
        });

    }
}

程序.cs

builder.Services.AddIdentity<ApplicationUser, ApplicationRole>(options => options.SignIn.RequireConfirmedAccount = false)
    .AddEntityFrameworkStores<ApplicationDbContext>();

参考:添加用户和角色导航属性

© www.soinside.com 2019 - 2024. All rights reserved.