I am trying to set many-many relationship with AspNetUserRoles in .Net 6, EntityFrameworkCore but getting error:
Cannot use table 'AspNetUserRoles' for entity type 'DeltaIdentityUserRole' since it is being used for entity type 'AspNetUserRoles (Dictionary<string, object>)' and potentially other entity types, but there is no linking relationship. Add a foreign key to 'DeltaIdentityUserRole' on the primary key properties and pointing to the primary key on another entity type mapped to 'AspNetUserRoles'.
Here is the code:
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; }
}
DB Context:
DeltaContext : DeltaIdentityContext<DeltaIdentityUser<int>, DeltaIdentityRole<int>, int, IdentityUserClaim<int>, DeltaIdentityUserRole<int>, IdentityUserLogin<int>, IdentityRoleClaim<int>, IdentityUserToken<int>>
DBSet:
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!;
On Model Creating:
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");
});
UserProfile:
public virtual ICollection<DeltaIdentityRole<int>> AspNetRoles { get; set; }
public virtual DeltaIdentityUser<int> AspNetUser { get; set; }
public virtual ICollection<DeltaIdentityUserRole<int>> AspNetUserRoles { get; set; }
Here is need to set many-many relationship with userprofile and 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");
});
}
So now when i try to add migration to generate identity schema i get error Cannot use table 'AspNetUserRoles' for entity type 'DeltaIdentityUserRole' since it is being used for entity type 'AspNetUserRoles (Dictionary<string, object>)' and potentially other entity types, but there is no linking relationship. Add a foreign key to 'DeltaIdentityUserRole' on the primary key properties and pointing to the primary key on another entity type mapped to 'AspNetUserRoles'.
WHat i need to get done is UserProfile table should have many-many relation with DeltaIdentityUserRole(AspNetUserRoles table)