c# - ASP.NET Core 2 +获取数据库上下文实例

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

我正在尝试获取DbContext的实例(以便在启动时可以做一些额外的工作),尝试在Configure方法中获取实例时出现以下错误:

System.InvalidOperationException:'无法从根提供程序解析作用域服务'MyApp.Data.MyDbContext'。

public void ConfigureServices(IServiceCollection services)
{
 services.AddDbContext<MyDbContext>(
                options => options.UseSqlServer(Configuration.GetConnectionString("MyDbContext")));
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{

    var dbContext = app.ApplicationServices.GetService(typeof(MyDbContext)) as MyDbContext;
}

我可以通过 Controller 等访问DbContext的实例

最佳答案

Paul Hiles的评论是正确的,但该方法在.NET Core 1.0中效果更好。

在ASP.NET Core 2.0中,通常不建议在Startup.cs中运行任何数据库设置。这是因为如果您从CLI或Visual Studio运行任何迁移,它将运行所有Startup.cs并尝试运行配置,这将失败。当然,如果您不使用 Entity Framework ,那么这不是问题,但是仍然不是在2.0中推荐的方法。现在建议使用Program.cs进行操作。

例如,您可以创建IWebHost的扩展方法,该方法将运行所需的任何设置。

public static IWebHost MigrateDatabase(this IWebHost webHost)
{
    var serviceScopeFactory = (IServiceScopeFactory)webHost.Services.GetService(typeof(IServiceScopeFactory));

    using (var scope = serviceScopeFactory.CreateScope())
    {
        var services = scope.ServiceProvider;
        var dbContext = services.GetRequiredService<YourDbContext>();

        dbContext.Database.Migrate();
    }

    return webHost;
}

然后在Program.cs中,您可以在运行之前调用该方法。
public static void Main(string[] args)
{
    BuildWebHost(args)
        .MigrateDatabase()
        .Run();
}

关于c# - ASP.NET Core 2 +获取数据库上下文实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45885019/

相关文章:

c# - sql 税和 odbc 代码不会插入?

c# - 内存泄漏与 ContextMenuStrip

entity-framework-core - 如何将 View 和存储过程从 SQL Server 搭建到 ASP.NET Core 2.2 项目中?

c# - 如何获得 Expression.Lambda<Func<T, bool>> 泛型

c# - Scaffold-DbContext 实例失败 - 从现有数据库创建模型(具有个人身份的项目)

c# - 页面加载时打印 pdf

c# - 动态设置属性 WPF 应用程序

asp.net-core - “在已注册的 .NET 数据提供程序列表中找不到指定的不变名称 'System.Data.SqlClient'。”在 .netCore 项目上

asp.net-core - 无法跟踪实体类型 '' 的实例,因为已在跟踪键值为 '{Id: 13}' 的另一个实例

sql-server - SQL Server与Docker和Entity Framework的连接