我有一个正在注册和播种的数据库上下文。但是,我收到错误:
<块引用>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; }
}
是什么导致了这个错误,我该如何解决?
答案 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