【问题标题】:How to access DbContext in/from Program class?如何在 Program 类中/从 Program 类中访问 DbContext?
【发布时间】:2021-04-01 03:01:35
【问题描述】:

我已经设置了一个 ASP.NET Core 项目,并在 Startup.cs 中配置了DbContext,例如 -

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<DBContext>(options =>
        options.UseSqlServer(Configuration["ConnectionStrings:DefaultConnection"]));
}

我可以通过依赖注入访问控制器类中的DbContext 对象。但我需要在 Program 类(在 Program.cs 文件中)中引用 DbContext

我尝试了以下方法,但它表明语法错误-

public class Program
{
    public static void Main(string[] args)
    {
        using (var db = new DBContext())    // getting syntax error here
        {
            db.Database.EnsureCreated();
        }
        CreateHostBuilder(args).Build().Run();
    }


    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>()
                    .UseUrls("http://localhost:4000");
            });
}

那么,如何访问 Program 类中的DbContext 对象呢?

【问题讨论】:

  • 我需要找到一种方法来获取 program.cs 中的 dbcontext,就像我们在任何其他控制器中访问相同的一样。

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


【解决方案1】:

由于您已使用依赖注入注册并配置了数据库上下文,因此您不能只使用 new 创建上下文,因为这样会跳过配置。

相反,您需要从依赖注入服务提供程序中检索数据库上下文,该服务提供程序可从您的Program 中构建的Host 获得。

由于默认情况下数据库上下文具有作用域生命周期,因此您需要先创建一个作用域,在该作用域内检索数据库上下文,最后在完成后再次释放作用域。

这应该是这样的:

public static void Main(string[] args)
{
    var host = CreateHostBuilder(args).Build();

    using (var scope = host.Services.CreateScope())
    {
        var db = scope.ServiceProvider.GetRequiredService<DBContext>();
        db.Database.EnsureCreated();
    }

    host.Run();
}

【讨论】:

    猜你喜欢
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    相关资源
    最近更新 更多