使用上下文后无法托管API

时间:2019-07-06 20:49:53

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

我正在尝试托管我的API,但无法正常工作。一旦将数据库的初始化代码移至Program Main一处,便出现了问题。我将问题范围缩小到,只要执行host.Run(),对db上下文的任何使用都将导致应用程序无法托管。没有引发异常,但应用程序未正确托管(我无法访问api网址,并且该应用程序不会自动打开默认网址)。

最终我在使用db上下文中的任何方法之前弄清了是否执行host.Run(),该应用程序将正常工作。这不是最佳解决方案,我想知道问题出在哪里。上下文方法可以正确执行,并且我可以向数据库中添加内容,如果我在host.Run()之前使用上下文,则该应用程序将不会托管。

public class Program
{
    public static void Main(string[] args)
    {

        var host = CreateWebHostBuilder(args).Build();

        using (var scope = host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;
            try
            {
                var context = services.GetRequiredService<CashinContext>();
                context.Database.EnsureCreated();
                //DbInitializer.Initialize(context);
            }
            catch (Exception ex)
            {
                var logger = services.GetRequiredService<ILogger<Program>>();
                logger.LogError(ex, "An error occured while seeding the database.");
            }

        }

        host.Run();

    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}

更新 通过更改代码,

var context = services.GetRequiredService<CashinContext>();

收件人

var context = services.GetService<CashinContext>();

现在可以使用了。我不明白为什么,因为GetRequiredService()应该在没有可用服务时引发异常,因此从来没有引发过异常。使用GetService()时,如果没有可用的服务,该函数应返回null。我通过调试检查了此内容,但未返回null,一切都很好。

0 个答案:

没有答案