Estou acompanhando um Instrutor, no começo tudo estava indo bem, mas depois que postei o projeto no github, houve alterações nos arquivos do projeto, acho que fiz algo errado, editei o conteúdo depois. Mas tem um ponto que perdi, acho que não consigo estabelecer a conexão com o banco de dados (ou não entendi) também tentei as soluções da página sobre esse assunto, mas não funcionou. Você poderia por favor me ajudar?
o erro que recebo é o seguinte
System.AggregateException: 'Some services are not able to be constructed (Error while validating the service descriptor 'ServiceType: Repositories.RepositoryContext Lifetime: Scoped ImplementationType: Repositories.RepositoryContext': Unable to resolve service for type 'Microsoft.EntityFrameworkCore.DbSet
1[Entities.Models.Product]' ao tentar ativar 'Repositories.RepositoryContext'.) (Erro ao validar o descritor de serviço 'ServiceType: Repositories.Contracts.IRepositoryManager Lifetime: Scoped ImplementationType: Repositories.RepositoryManager': Não é possível resolver o serviço para digite 'Microsoft.EntityFrameworkCore.DbSet1[Entities.Models.Product]' while attempting to activate 'Repositories.RepositoryContext'.) (Error while validating the service descriptor 'ServiceType: Repositories.Contracts.IProductRepository Lifetime: Scoped ImplementationType: Repositories.ProductRepository': Unable to resolve service for type 'Microsoft.EntityFrameworkCore.DbSet
1[Entities.Models.Product]' ao tentar ativar 'Repositories.RepositoryContext'.)
InvalidOperationException: Unable to resolve service for type 'Microsoft.EntityFrameworkCore.DbSet
1[Entities.Models.Product]' ao tentar ativar 'Repositories.RepositoryContext'. `
Verifiquei minhas camadas de repositório uma por uma, verifiquei meus links Program.cs um por um, verifiquei as instruções no site da Microsoft, mas acho que não consegui resolver isso com meu nível atual de conhecimento.
Minha página de contexto do repositório se parece com isso
public class RepositoryContext : DbContext
{
public DbSet<Product> Products { get; set; }
public DbSet<Category> Categories { get; set; }
public RepositoryContext(DbContextOptions<RepositoryContext> options, DbSet<Product> products, DbSet<Category> categories) :
base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Product>()
.HasData(new Product() { Id = 1, ProductName = "Laptop", Price = 1000 },
new Product() { Id = 2, ProductName = "Keyboard", Price = 500 },
new Product() { Id = 3, ProductName = "Computer", Price = 2500 },
new Product() { Id = 4, ProductName = "Monitor", Price = 1000 },
new Product() { Id = 5, ProductName = "Deck", Price = 500 }
);
modelBuilder.Entity<Category>()
.HasData(
new Category() { CategoryId = 1, CategoryName = "Book" },
new Category() { CategoryId = 2, CategoryName = "Electronic" });
}
}
Este é o meu código no início do programa
var builder = WebApplication.CreateBuilder(args);
builder.Services
.AddControllersWithViews();
builder.Services.AddDbContext<RepositoryContext>(options =>
{
options.UseSqlite(builder.Configuration.GetConnectionString
("sqlconnection"),
b => b.MigrationsAssembly("StoreApp"));
});
builder.Services.AddScoped<IRepositoryManager, RepositoryManager>();
builder.Services.AddScoped<IProductRepository, ProductRepository>();
var app = builder.Build();
app.UseStaticFiles();
app.UseHttpsRedirection();
app.UseRouting();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
e os objetos têm esta forma
public class Product
{
public int Id { get; set; }
public String? ProductName { get; set; } = String.Empty;
public decimal Price { get; set; }
}
public class Category
{
public int CategoryId { get; set; }
public String? CategoryName { get; set; }= String.Empty;
}
Você não deve injetar
DbSet
, apenas remova-os do ctor:Ou:
Para lidar com avisos de nulidade, se houver.
Veja também:
Que necessidade você tem de injetar
DbSet<Product>
eDbSet<Category>
no construtor? Deve funcionar bem sem esses parâmetros no construtor.Esses dois argumentos não puderam ser construídos e foi isso que gerou a exceção de resolução de serviço.