EF Core 3.1 Настройка модели идентичности - что я сделал не так? - PullRequest
1 голос
/ 20 марта 2020

Не уверен, что я делаю неправильно и почему создается двойная навигация для каждой таблицы. Я читаю руководство от https://docs.microsoft.com/en-us/aspnet/core/security/authentication/customize-identity-model?view=aspnetcore-3.1.

Это сводит меня с ума, и мне нужно решить эту проблему, прежде чем выходить в эфир на следующей неделе.

SQL Diagram

Любая помощь будет высоко ценится.

Юридические лица:



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



1 Ответ

0 голосов
/ 31 марта 2020

Я считаю, что вы делаете бесполезную работу, чего бы вы хотели достичь? Для чего нужен двойной внешний ключ?

Если вы просто хотите добавить столбцы в таблицы безопасности, следуйте этому посту, он написан простым и точным способом:

Как добавить Пользовательские свойства пользователя в Identity Membership System

Это небольшой пример:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity;

namespace Identity.Models
{
    public class AppUser : IdentityUser
    {
        public Country Country { get; set; }

        public int Age { get; set; }

        [Required]
        public string Salary { get; set; }
    }

    public enum Country
    {
        USA, UK, France, Germany, Russia
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...