sql >> Database >  >> RDS >> Mysql

EF Core 2.0 Identity - Navigatie-eigenschappen toevoegen

Ik weet niet waarom, deze handige navigatie-eigenschappen zijn er niet. Ik wil gebruikers met hun rollen weergeven.

Dus ik deed het volgende:

public class ApplicationUser : IdentityUser
{
    public virtual ICollection<ApplicationUserRole> UserRoles { get; } = new List<ApplicationUserRole>();
}

public class ApplicationUserRole : IdentityUserRole<string>
{
    public virtual ApplicationUser User { get; set; }
    public virtual ApplicationRole Role { get; set; }
}

public class ApplicationRole : IdentityRole<string>
{
    public ApplicationRole(){ }

    public ApplicationRole(string roleName)
        : base(roleName)
    {
    }

    public virtual ICollection<ApplicationUserRole> UserRoles { get; } = new List<ApplicationUserRole>();
}

Dit creëert de navigatie, maar het creëert extra kolommen zoals RoleId1 en Discriminator . Dus heb ik het volgende toegevoegd volgens IdentityUser POCO-navigatie-eigenschappen toevoegen .

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);

    builder.Entity<ApplicationUser>()
        .HasMany(e => e.UserRoles)
        .WithOne()
        .HasForeignKey(e => e.UserId)
        .IsRequired()
        .OnDelete(DeleteBehavior.Cascade);

    builder.Entity<ApplicationUserRole>()
        .HasOne(e => e.User)
        .WithMany(e => e.UserRoles)
        .HasForeignKey(e => e.UserId);

    builder.Entity<ApplicationUserRole>()
        .HasOne(e => e.Role)
        .WithMany(e => e.UserRoles)
        .HasForeignKey(e => e.RoleId);
}

Maar ik heb nog steeds beide kolommen RoleId1 en Discriminator . Daarna vervang ik door de nieuwe ApplicationRole-klasse in ApplicationDbContext, DI-configuratieservice en DB-seed.

public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, string, IdentityUserClaim<string>
    , ApplicationUserRole, IdentityUserLogin<string>, IdentityRoleClaim<string>, IdentityUserToken<string>>
{
    ...
}

public void ConfigureServices(IServiceCollection services)
{
   ...
   services.AddIdentity<ApplicationUser, ApplicationRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();
   ...
}

public DbInitializer(
        ApplicationDbContext context,
        UserManager<ApplicationUser> userManager,
        RoleManager<ApplicationRole> roleManager)
    {
        _context = context;
        _userManager = userManager;
        _roleManager = roleManager;
    }

public async void Initialize()
    {
        _context.Database.EnsureCreated();

        if (!_context.Roles.Any(r => r.Name == SharedConstants.Role.ADMINISTRATOR))
            await _roleManager.CreateAsync(new ApplicationRole(SharedConstants.Role.ADMINISTRATOR));
    }            

Ik kon ook navigeren en de voornaam van de rol krijgen.

ctx.Users.Select(e => new
            {
                e.Id,
                e.UserName,
                e.Email,
                e.PhoneNumber,
                Roles = e.UserRoles.Select(i => i.Role.Name).ToList()
            }).ToList();

Ik hoop dat dit je een idee geeft voor Claims navigatie-eigenschap.



  1. Hoe een geheel getal naar een decimaal te converteren in SQL Server

  2. Op afstand verbinding maken met clearDB heroku-database

  3. MySQL Workbench-sessie ziet geen updates voor de database

  4. PreparedStatement negeert parameters in de query:java.sql.SQLException:Parameterindex buiten bereik (1> aantal parameters, dat is 0)