EntityFrameworkCore - 无法将表“AspNetUserRoles”用于实体类型 DeltaIdentityUserRole,因为它用于实体类型“AspNetUserRoles”

Abh*_*ain 6 .net c# orm entity-framework-core .net-core

我试图在 .Net 6、EntityFrameworkCore 中设置与 AspNetUserRoles 的多对多关系,但出现错误:

无法将表“AspNetUserRoles”用于实体类型“DeltaIdentityUserRole”,因为它用于实体类型“AspNetUserRoles (Dictionary<string, object>)”以及可能的其他实体类型,但不存在链接关系。将外键添加到主键属性上的“DeltaIdentityUserRole”,并指向映射到“AspNetUserRoles”的另一个实体类型上的主键。

这是代码:

public class DeltaIdentityUser<T> : IdentityUser<int>
    {
        public virtual UserProfile User { get; set; }
    }
    public class DeltaIdentityRole<T> : IdentityRole<int>
    {
        internal virtual ICollection<UserProfile> UserProfiles { get; set; }
    }
    public class DeltaIdentityUserRole<T> : IdentityUserRole<int>
    {
        public virtual UserProfile User { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

数据库上下文:

DeltaContext : DeltaIdentityContext<DeltaIdentityUser<int>, DeltaIdentityRole<int>, int, IdentityUserClaim<int>, DeltaIdentityUserRole<int>, IdentityUserLogin<int>, IdentityRoleClaim<int>, IdentityUserToken<int>>
Run Code Online (Sandbox Code Playgroud)

数据库集:

public virtual DbSet<DeltaIdentityUser<int>> AspNetUser { get; set; } = null!;
        public virtual DbSet<DeltaIdentityUserRole<int>> AspNetUserRoles { get; set; } = null!;
        public virtual DbSet<DeltaIdentityRole<int>> AspNetRole { get; set; } = null!;
Run Code Online (Sandbox Code Playgroud)

关于模型创建:

modelBuilder.Entity<DeltaIdentityUser<int>>(entity =>
            {
                entity.HasOne(d => d.User)
                    .WithOne(p => p.AspNetUser)
                    .HasForeignKey<DeltaIdentityUser<int>>(d => d.Id)
                    .OnDelete(DeleteBehavior.ClientSetNull)
                    .HasConstraintName("FK_dbo.AspNetUsers_dbo.UserProfiles_UserId");
            });

            modelBuilder.Entity<DeltaIdentityUserRole<int>>(entity =>
            {
                entity.HasOne(d => d.User)
                    .WithMany(p => p.AspNetUserRoles)
                    .HasForeignKey(d => d.UserId)
                    .HasConstraintName("FK_dbo.AspNetUserRoles_dbo.UserProfiles_UserId");
            });
Run Code Online (Sandbox Code Playgroud)

用户资料:

public virtual ICollection<DeltaIdentityRole<int>> AspNetRoles { get; set; }
        public virtual DeltaIdentityUser<int> AspNetUser { get; set; }
        public virtual ICollection<DeltaIdentityUserRole<int>> AspNetUserRoles { get; set; }
Run Code Online (Sandbox Code Playgroud)

这里需要设置 userprofile 和 AspNetUserRoles 的多对多关系:

    modelBuilder.Entity<UserProfile>(entity =>
{
            entity.HasMany(d => d.AspNetRoles)
                        .WithMany(p => p.UserProfiles)
                        .UsingEntity<Dictionary<string, object>>(
                            "AspNetUserRoles",
                            l => l.HasOne<DeltaIdentityRole<int>>().WithMany().HasForeignKey("RoleId").HasConstraintName("FK_AspNetUserRoles_AspNetRoles_RoleId"),
                            r => r.HasOne<UserProfile>().WithMany().HasForeignKey("UserId").HasConstraintName("FK_dbo.AspNetUserRoles_dbo.UserProfiles_UserId")
                        ,
                                j =>
                                {
                                    j.ToTable("AspNetUserRoles");
                                });
}
Run Code Online (Sandbox Code Playgroud)

因此,现在当我尝试添加迁移以生成身份架构时,出现错误 Cannot use table 'AspNetUserRoles' forEntity type 'DeltaIdentityUserRole',因为它用于实体类型 'AspNetUserRoles (Dictionary<string, object>)' 和可能的其他实体类型,但不存在链接关系。将外键添加到主键属性上的“DeltaIdentityUserRole”,并指向映射到“AspNetUserRoles”的另一个实体类型上的主键。

我需要完成的是 UserProfile 表应该与 DeltaIdentityUserRole(AspNetUserRoles 表)有多对关系