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 表)有多对关系