ASP.NET依赖注入报错:无法解析DbSet服务激活RepositoryContext
解决ASP.NET中无法解析DbSet服务激活RepositoryContext的依赖注入错误
问题出在RepositoryContext的构造函数上——你没必要把DbSet<Product>和DbSet<Category>作为构造参数传入EF Core的DbContext。EF Core会自动为DbContext生成并管理DbSet实例,不需要通过依赖注入容器提供这些服务,这就是为什么DI容器找不到对应的服务实现,抛出激活错误。
修复步骤:
修改RepositoryContext的构造函数,移除DbSet<Product>和DbSet<Category>参数,只保留DbContextOptions<RepositoryContext>:
public class RepositoryContext : DbContext { public DbSet<Product> Products { get; set; } public DbSet<Category> Categories { get; set; } // 只保留DbContextOptions参数 public RepositoryContext(DbContextOptions<RepositoryContext> options) : 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" }); } }
为什么这样改:
DbContext的DbSet属性是EF Core用来映射数据库表的入口,EF Core会在DbContext实例化时自动初始化这些属性,不需要手动注入。你之前的构造函数要求DI容器提供DbSet实例,但你从未在Program.cs中注册过DbSet类型的服务,所以容器无法解析,导致错误。
你的Program.cs配置是正确的,不需要修改——AddDbContext<RepositoryContext>已经正确注册了DbContext服务,修改构造函数后DI就能正常激活RepositoryContext了。
内容的提问来源于stack exchange,提问作者Mehmet
相关产品推荐
相关产品推荐

