I am trying to add default role to user by registration but a second empty users is created in database and a second empty role is created too.
In Register.cshtml.cs and in function OnPostAsync I am trying to create the "default" if it doesn't exist and assign user to it if it exists.
var defaultrole = _roleManager.FindByNameAsync("default").Result;
if (defaultrole != null)
{
IdentityResult addToRoleresult = await _userManager.AddToRoleAsync(user, defaultrole.Name);
}
else
{
IdentityResult roleCreateResult = await _roleManager.CreateAsync(new EmployeesCalendarIdentityRole("default"));
if (roleCreateResult.Succeeded)
{
IdentityResult roleresult = await _userManager.AddToRoleAsync(user, "default");
}
}
The code in EmployeesCalendarIdentityContext.cs is the following
using EmployeesCalendar.Areas.Identity.Data;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using System.Reflection.Emit;
namespace EmployeesCalendar.Data;
public class EmployeesCalendarIdentityContext : IdentityDbContext<
EmployeesCalendarIdentityUser, EmployeesCalendarIdentityRole, string,
EmployeesCalendarIdentityUserClaim, EmployeesCalendarIdentityUserRole, EmployeesCalendarIdentityUserLogin,
EmployeesCalendarIdentityRoleClaim, EmployeesCalendarIdentityUserToken>
{
public EmployeesCalendarIdentityContext(DbContextOptions<EmployeesCalendarIdentityContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
// Customize the ASP.NET Identity model and override the defaults if needed.
// For example, you can rename the ASP.NET Identity table names and more.
// Add your customizations after calling base.OnModelCreating(builder);
builder.Entity<EmployeesCalendarIdentityUser>(b =>
{
// Each User can have many UserClaims
b.HasMany(e => e.Claims)
.WithOne(e => e.User)
.HasForeignKey(uc => uc.UserId)
.IsRequired();
// Each User can have many UserLogins
b.HasMany(e => e.Logins)
.WithOne(e => e.User)
.HasForeignKey(ul => ul.UserId)
.IsRequired();
// Each User can have many UserTokens
b.HasMany(e => e.Tokens)
.WithOne(e => e.User)
.HasForeignKey(ut => ut.UserId)
.IsRequired();
// Each User can have many entries in the UserRole join table
b.HasMany(e => e.UserRoles)
.WithOne(e => e.User)
.HasForeignKey(ur => ur.UserId)
.IsRequired();
});
builder.Entity<EmployeesCalendarIdentityRole>(b =>
{
// 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();
// Each Role can have many associated RoleClaims
b.HasMany(e => e.RoleClaims)
.WithOne(e => e.Role)
.HasForeignKey(rc => rc.RoleId)
.IsRequired();
});
builder.Entity<EmployeesCalendarIdentityUserRole>().HasKey(p => new { p.UserId, p.RoleId });
}
}
And the code for the overrided user, roles etc is like this
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity;
namespace EmployeesCalendar.Areas.Identity.Data;
// Add profile data for application users by adding properties to the EmployeesCalendarIdentityUser class
public class EmployeesCalendarIdentityUser : IdentityUser
{
[PersonalData]
public string? Name { get; set; }
[PersonalData]
public DateTime DOB { get; set; }
public virtual List<EmployeesCalendarIdentityUserClaim> Claims { get; set; }=new List<EmployeesCalendarIdentityUserClaim>();
public virtual List<EmployeesCalendarIdentityUserLogin> Logins { get; set; }=new List<EmployeesCalendarIdentityUserLogin>();
public virtual List<EmployeesCalendarIdentityUserToken> Tokens { get; set; }= new List<EmployeesCalendarIdentityUserToken>();
public virtual List<EmployeesCalendarIdentityUserRole> UserRoles { get; set; }=new List<EmployeesCalendarIdentityUserRole>();
}
public class EmployeesCalendarIdentityRole : IdentityRole
{
public EmployeesCalendarIdentityRole()
{
}
public EmployeesCalendarIdentityRole(string roleName) : base(roleName)
{
}
public virtual List<EmployeesCalendarIdentityUserRole> UserRoles { get; set; }=new List<EmployeesCalendarIdentityUserRole>() ;
public virtual List<EmployeesCalendarIdentityRoleClaim> RoleClaims { get; set; } = new List<EmployeesCalendarIdentityRoleClaim>();
}
public class EmployeesCalendarIdentityUserRole : IdentityUserRole<string>
{
public virtual EmployeesCalendarIdentityUser User { get; set; } = new EmployeesCalendarIdentityUser();
public virtual EmployeesCalendarIdentityRole Role { get; set; }=new EmployeesCalendarIdentityRole();
}
public class EmployeesCalendarIdentityUserClaim : IdentityUserClaim<string>
{
public virtual EmployeesCalendarIdentityUser User { get; set; }=new EmployeesCalendarIdentityUser();
}
public class EmployeesCalendarIdentityUserLogin : IdentityUserLogin<string>
{
public virtual EmployeesCalendarIdentityUser User { get; set; } = new EmployeesCalendarIdentityUser();
}
public class EmployeesCalendarIdentityRoleClaim : IdentityRoleClaim<string>
{
public virtual EmployeesCalendarIdentityRole Role { get; set; } = new EmployeesCalendarIdentityRole();
}
public class EmployeesCalendarIdentityUserToken : IdentityUserToken<string>
{
public virtual EmployeesCalendarIdentityUser User { get; set; } = new EmployeesCalendarIdentityUser();
}
Any idea why?