Не уверен, что я делаю неправильно и почему создается двойная навигация для каждой таблицы. Я читаю руководство от https://docs.microsoft.com/en-us/aspnet/core/security/authentication/customize-identity-model?view=aspnetcore-3.1.
Это сводит меня с ума, и мне нужно решить эту проблему, прежде чем выходить в эфир на следующей неделе.
Любая помощь будет высоко ценится.
Юридические лица:
public class AppUser : IdentityUser<long>
{
public bool HasResetPassword { get; set; }
public DateTime? LastLogIn { get; set; }
public DateTime? DateRegistered { get; set; }
public DateTime? RegistrationDate { get; set; }
public override string ToString()
{
return UserName;
}
public virtual ICollection<AppUserClaim> Claims { get; set; }
public virtual ICollection<AppUserLogin> Logins { get; set; }
public virtual ICollection<AppUserToken> Tokens { get; set; }
public virtual ICollection<AppUserRole> UserRoles { get; set; }
}
public class AppRole : IdentityRole<long>
{
public string Description { get; set; }
public virtual ICollection<AppUserRole> UserRoles { get; set; }
public override string ToString()
{
return $"{Name} - {Description}";
}
}
public class AppUserRole : IdentityUserRole<long>
{
public virtual AppUser User { get; set; }
public virtual AppRole Role { get; set; }
}
public class AppUserClaim : IdentityUserClaim<long>
{
public virtual AppUser User { get; set; }
}
public class AppUserLogin : IdentityUserLogin<long>
{
public virtual AppUser User { get; set; }
}
public class AppRoleClaim : IdentityRoleClaim<long>
{
public virtual AppRole Role { get; set; }
}
public class AppUserToken : IdentityUserToken<long>
{
public virtual AppUser User { get; set; }
}```
DbContext
public partial class ApplicationDbContext
: IdentityDbContext<AppUser, AppRole, long, AppUserClaim, AppUserRole, AppUserLogin, AppRoleClaim, AppUserToken>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
{
}
...
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
foreach (var relationship in modelBuilder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys()))
{
relationship.DeleteBehavior = DeleteBehavior.Restrict;
}
#region Identity
modelBuilder.Entity<AppUser>(b =>
{
// Each User can have many UserClaims
b.HasMany(e => e.Claims)
.WithOne()
.HasForeignKey(uc => uc.UserId)
.IsRequired();
b.HasKey(u => u.Id);
b.Property(p => p.Id).ValueGeneratedOnAdd();
// Each User can have many UserLogins
b.HasMany(e => e.Logins)
.WithOne()
.HasForeignKey(ul => ul.UserId)
.IsRequired();
// Each User can have many UserTokens
b.HasMany(e => e.Tokens)
.WithOne()
.HasForeignKey(ut => ut.UserId)
.IsRequired();
// Each User can have many entries in the UserRole join table
b.HasMany(e => e.UserRoles)
.WithOne()
.HasForeignKey(ur => ur.UserId)
.IsRequired();
});
modelBuilder.Entity<AppRole>(b =>
{
b.HasKey(u => u.Id);
b.Property(p => p.Id).ValueGeneratedOnAdd();
// Each Role can have many entries in the UserRole join table
b.HasMany(e => e.UserRoles)
.WithOne(e => e.Role)
.HasForeignKey(ur => ur.RoleId)
.IsRequired();
});
modelBuilder.Entity<AppUserRole>(b =>
{
b.HasKey(u => new { u.RoleId, u.UserId });
});
modelBuilder.Entity<AppUserClaim>(b =>
{
b.HasKey(u => u.Id);
b.Property(p => p.Id).ValueGeneratedOnAdd();
});
modelBuilder.Entity<AppUserLogin>(b =>
{
b.HasKey(u => new { u.LoginProvider, u.ProviderKey });
});
modelBuilder.Entity<AppRoleClaim>(b =>
{
b.HasKey(u => u.Id);
b.Property(p => p.Id).ValueGeneratedOnAdd();
});
modelBuilder.Entity<AppUserToken>(b =>
{
b.HasKey(u => new { u.UserId, u.LoginProvider });
});
#endregion