Search code examples
c#asp.net-coreentity-framework-core.net-6.0ef-core-6.0

Some services are not able to be constructed ASP .NET 6 With EF Core


When I try to run my code error are displayed as (Some services are not able to be constructed)

Some services are not able to be constructed (Error while validating the service descriptor 'ServiceType: Microsoft.AspNetCore.Identity.IUserClaimsPrincipalFactory1[Proj.Core.Models.UserManagment.User] Lifetime: Scoped ImplementationType: Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory1[Proj.Core.Models.UserManagment.User]': Unable to resolve service for type 'Microsoft.AspNetCore.Identity.IUserStore1[Proj.Core.Models.UserManagment.User]' while attempting to activate 'Microsoft.AspNetCore.Identity.UserManager1[Proj.Core.Models.UserManagment.User]'.) (Error while validating the service descriptor 'ServiceType: Microsoft.AspNetCore.Identity.UserManager1[Proj.Core.Models.UserManagment.User] Lifetime: Scoped ImplementationType: Microsoft.AspNetCore.Identity.UserManager1[Proj.Core.Models.UserManagment.User]': Unable to resolve service for type 'Microsoft.AspNetCore.Identity.IUserStore1[Proj.Core.Models.UserManagment.User]' while attempting to activate 'Microsoft.AspNetCore.Identity.UserManager1[Proj.Core.Models.UserManagment.User]'.)

System.AggregateException
      HResult=0x80131500
      Message=Some services are not able to be constructed (Error while validating the service descriptor 'ServiceType: Microsoft.AspNetCore.Identity.IUserClaimsPrincipalFactory`1[Proj.Core.Models.UserManagment.User] Lifetime: Scoped ImplementationType: Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory`1[Proj.Core.Models.UserManagment.User]': Unable to resolve service for type 'Microsoft.AspNetCore.Identity.IUserStore`1[Proj.Core.Models.UserManagment.User]' while attempting to activate 'Microsoft.AspNetCore.Identity.UserManager`1[Proj.Core.Models.UserManagment.User]'.) (Error while validating the service descriptor 'ServiceType: Microsoft.AspNetCore.Identity.UserManager`1[Proj.Core.Models.UserManagment.User] Lifetime: Scoped ImplementationType: Microsoft.AspNetCore.Identity.UserManager`1[Proj.Core.Models.UserManagment.User]': Unable to resolve service for type 'Microsoft.AspNetCore.Identity.IUserStore`1[Proj.Core.Models.UserManagment.User]' while attempting to activate 'Microsoft.AspNetCore.Identity.UserManager`1[Proj.Core.Models.UserManagment.User]'.)
      Source=Microsoft.Extensions.DependencyInjection
      StackTrace:
       at Microsoft.Extensions.DependencyInjection.ServiceProvider..ctor(ICollection`1 serviceDescriptors, ServiceProviderOptions options)
       at Microsoft.Extensions.DependencyInjection.ServiceCollectionContainerBuilderExtensions.BuildServiceProvider(IServiceCollection services, ServiceProviderOptions options)
       at Microsoft.Extensions.DependencyInjection.DefaultServiceProviderFactory.CreateServiceProvider(IServiceCollection containerBuilder)
       at Microsoft.Extensions.Hosting.Internal.ServiceFactoryAdapter`1.CreateServiceProvider(Object containerBuilder)
       at Microsoft.Extensions.Hosting.HostBuilder.CreateServiceProvider()
       at Microsoft.Extensions.Hosting.HostBuilder.Build()
       at Microsoft.AspNetCore.Builder.WebApplicationBuilder.Build()
       at Program.<Main>$(String[] args) in C:\Users\user1\source\repos\Proj.E-Invoice\Proj.E-Invoice\Program.cs:line 37
    
      This exception was originally thrown at this call stack:
        [External Code]
    
    Inner Exception 1:
    InvalidOperationException: Error while validating the service descriptor 'ServiceType: Microsoft.AspNetCore.Identity.IUserClaimsPrincipalFactory`1[Proj.Core.Models.UserManagment.User] Lifetime: Scoped ImplementationType: Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory`1[Proj.Core.Models.UserManagment.User]': Unable to resolve service for type 'Microsoft.AspNetCore.Identity.IUserStore`1[Proj.Core.Models.UserManagment.User]' while attempting to activate 'Microsoft.AspNetCore.Identity.UserManager`1[Proj.Core.Models.UserManagment.User]'.
    
    Inner Exception 2:
    InvalidOperationException: Unable to resolve service for type 'Microsoft.AspNetCore.Identity.IUserStore`1[Proj.Core.Models.UserManagment.User]' while attempting to activate 'Microsoft.AspNetCore.Identity.UserManager`1[Proj.Core.Models.UserManagment.User]'.

When I try to remove this code the project will run successfully..

IdentityBuilder identityBuilder = builder.Services.AddIdentityCore<User>(pass =>
{
    pass.Password.RequireDigit = true;
    pass.Password.RequiredLength = 8;
    pass.Password.RequireNonAlphanumeric = true;
    pass.Password.RequireUppercase = true;
    pass.Password.RequireLowercase = true;
    pass.User.RequireUniqueEmail = true;
});

Program.cs

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Identity;
using Microsoft.DotNet.Scaffolding.Shared.ProjectModel;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.IdentityModel.Tokens;
using System;
using System.Text;
using Proj.Core;
using Proj.Core.IRepositories;
using Proj.Core.Models.UserManagment;
using Proj.EF;
using Proj.EF.Seed;

var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllersWithViews();

string conStr = builder.Configuration.GetConnectionString("DefaultConnection") ?? 
    throw new Exception("Connection string not defined!");

builder.Services.AddDbContext<DataContext>(options => options.UseSqlServer(conStr, b => b.MigrationsAssembly(typeof(DataContext).Assembly.FullName)));

IdentityBuilder identityBuilder = builder.Services.AddIdentityCore<User>(pass =>
{
    pass.Password.RequireDigit = true;
    pass.Password.RequiredLength = 8;
    pass.Password.RequireNonAlphanumeric = true;
    pass.Password.RequireUppercase = true;
    pass.Password.RequireLowercase = true;
    pass.User.RequireUniqueEmail = true;
});

//builder.Services.AddTransient<ISeed, Seed>();
builder.Services.AddTransient<IUnitOfWork, UnitOfWork>();

var app = builder.Build();

//using (var obj = app.Services.CreateScope())
//{
//    var services = obj.ServiceProvider;

//    var seeder = services.GetRequiredService<Seed>();

//    seeder.SeedRolesAndUsers();
//}

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

**DataContext class: ** DataContext.cs

using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata;
using Proj.Core.Models;
using Proj.Core.Models.UserManagment;

namespace Proj.EF
{
    public class DataContext : IdentityDbContext<User, Role, long, 
        IdentityUserClaim<long>, UserRole, IdentityUserLogin<long>,
        IdentityRoleClaim<long>, IdentityUserToken<long>>
    {
        public DataContext(DbContextOptions<DataContext> options) : base(options)
        {

        }

        public DbSet<Company> Companies { get; set; }
        public DbSet<Account> Accounts { get; set; }
        public DbSet<City> Cities { get; set; }
        public DbSet<Contact> Contacts { get; set; }
        public DbSet<Country> Countries { get; set; }
        public DbSet<Package> Packages { get; set; }
        public DbSet<Product> Products { get; set; }
        public DbSet<PackagesHistory> PackagesHistories { get; set; }

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

            modelBuilder.Entity<Country>()
            .HasMany(c => c.Cities)
            .WithOne(c => c.Country)
            .HasForeignKey(c => c.CountryId).OnDelete(DeleteBehavior.Restrict);

            modelBuilder.Entity<UserRole>(userRole =>
            {
                userRole.HasKey(ur => new { ur.UserId, ur.RoleId });

                userRole.HasOne(ur => ur.Role)
                    .WithMany(r => r.UserRoles)
                    .HasForeignKey(ur => ur.RoleId)
                    .IsRequired();

                userRole.HasOne(ur => ur.User)
                    .WithMany(r => r.UserRoles)
                    .HasForeignKey(ur => ur.UserId)
                    .IsRequired();
            });

            modelBuilder.Properties()
            .Where(x => x.Name == "Id")
            .Configure(p => p.SetColumnName("Id"));

            modelBuilder.EntityTypes()
                .ToList()
                .ForEach(e => e.SetTableName(e.GetTableName()));

            modelBuilder.Properties()
                        .Where(x => x.Name == "Id")
                        .Configure(p => p.SetIdentityIncrement(1));

            modelBuilder.Properties()
                .Where(x => x.Name == "Id")
                .Configure(p => p.IsPrimaryKey());


            #region Change Names For Tables

            modelBuilder.Entity<User>(entity =>
            {
                entity.ToTable(name: "User");
            });

            modelBuilder.Entity<Role>(entity =>
            {
                entity.ToTable(name: "Role");
            });

            modelBuilder.Entity<UserRole>(entity =>
            {
                entity.ToTable("UserRoles");
            });

            modelBuilder.Entity<IdentityUserClaim<long>>(entity =>
            {
                entity.ToTable("UserClaims");
            });

            modelBuilder.Entity<IdentityUserLogin<long>>(entity =>
            {
                entity.ToTable("UserLogins");
            });

            modelBuilder.Entity<IdentityRoleClaim<long>>(entity =>
            {
                entity.ToTable("RoleClaims");
            });

            modelBuilder.Entity<IdentityUserToken<long>>(entity =>
            {
                entity.ToTable("UserTokens");
            });

            #endregion
        }
    }

Error Description:


Solution

  • This case resolved by doing the following steps:

    1.In class Program.cs Replace this code

    IdentityBuilder identityBuilder = builder.Services.AddIdentityCore<User>(pass =>
    {
        pass.Password.RequireDigit = true;
        pass.Password.RequiredLength = 8;
        pass.Password.RequireNonAlphanumeric = true;
        pass.Password.RequireUppercase = true;
        pass.Password.RequireLowercase = true;
        pass.User.RequireUniqueEmail = true;
    });
    

    With:

    IdentityBuilder identityBuilder = builder.Services.AddIdentity<User, Role>(pass =>
    {
        pass.Password.RequireDigit = true;
        pass.Password.RequiredLength = 8;
        pass.Password.RequireNonAlphanumeric = true;
        pass.Password.RequireUppercase = true;
        pass.Password.RequireLowercase = true;
        pass.User.RequireUniqueEmail = true;
    }).AddEntityFrameworkStores<DataContext>()
    .AddDefaultTokenProviders();