尚未注册类型“Type”的服务

时间:2021-02-18 02:47:41

标签: c# asp.net entity-framework-core

我有一个正在注册和播种的数据库上下文。但是,我收到错误:

<块引用>

System.InvalidOperationException: '没有类型服务 'AnnouncementContext' 已注册。'

数据库注册/播种

private static void SeedDatabase(IHost host)
        {
            var scopeFactory = host.Services.GetRequiredService<IServiceScopeFactory>();
            using var scope = scopeFactory.CreateScope();
            var announcementContext = scope.ServiceProvider.GetRequiredService<AnnouncementContext>(); // exception occurs here

            if (announcementContext.Database.EnsureCreated()) {
                try {
                    SeedData.Initialize(announcementContext);
                }
                catch (Exception ex) {
                    var logger = scope.ServiceProvider.GetRequiredService<ILogger<Program>>();
                    logger.LogError(ex, "A database seeding error occurred.");
                    ErrorLogger.logError(ex);
                }
            }
        }

上下文类

public class AnnouncementContext : DbContext {
        public AnnouncementContext(DbContextOptions<AnnouncementContext> options)
            : base(options) {
        }

        public DbSet<Announcement> Announcements { get; set; }
    }

是什么导致了这个错误,我该如何解决?

1 个答案:

答案 0 :(得分:0)

DB registering/seeding 部分中的代码未注册任何 DB 或 DbContext。它正在尝试获取已经注册的 DbContext 的引用(在您的情况下为 AnnouncementContext)。那么问题来了,你已经注册了吗?错误消息表明,您没有。

在最常见的情况下,您应该在 AnnouncementContext 类的 ConfigureServices() 方法中注册 Startup,例如 -

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();

    // this is the DbContext registration code
    services.AddDbContext<AnnouncementContext>(
        options => options.UseSqlServer("name=ConnectionStrings:DefaultConnection"));
}

关于这方面的更多信息 - DbContext in dependency injection for ASP.NET Core

相关问题