C# 如何在DbContext中获取IConfiguration实例?

C# 如何在DbContext中获取IConfiguration实例?,c#,entity-framework,.net-core,C#,Entity Framework,.net Core,我已经看到了许多解释.NETCore+EF配置的例子,但是没有一个解释如何在DbContext中获得配置实例 我需要它的原因是为了获取db连接字符串: namespace Models { public class BlogContext : DbContext { public DbSet<Blog> Blogs { get; set; } public DbSet<Post> Posts { get; set; }

我已经看到了许多解释.NETCore+EF配置的例子,但是没有一个解释如何在
DbContext
中获得
配置
实例

我需要它的原因是为了获取db连接字符串:

namespace Models
{
    public class BlogContext : DbContext
    {

        public DbSet<Blog> Blogs { get; set; }
        public DbSet<Post> Posts { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder options)
            => options.UseSqlite(Configuration.GetConnectionString("BlogDb"));

    }
}
大多数教程都显示了数据库上下文中的
IConfiguration
实例。我怀疑它是通过构造函数发生的:

private readonly IConfiguration Configuration;
public BlogContext(IConfiguration config) {
    Configuration = config;
}
但是,这实际上是如何被注射的呢

这就是我使用上下文的方式:

public class Seed
    {
        public static void SeedDatabase()
        {
            using var db = new BlogContext();
            ... stuff ...
        }
    }
如何从设置文件中获取连接字符串?做一些非常简单的事情似乎很混乱,而且要做很多工作

更新

我正在使用
种子
这样:

public class Program
    {
        public static void Main(string[] args)
        {
            Seed.SeedDatabase();
        }
    }

如何将
DbContext
的实例实际导入
SeedDatabase

基于上面的代码,看起来在注入依赖项和静态代码方面可能存在一些混合和匹配,这让您头痛。中间的示例希望配置通过构造函数注入来实现,但随后您在静态方法中创建了一个无法使用它的实例

理想情况下,在您的服务注册过程中,您会执行以下操作:

services.AddDbContext<BlogContext>(options => 
    options.UseSqlite(Configuration.GetConnectionString("BlogDb")));
}

更现实地说,看起来您正在尝试为数据库添加种子(duh)。如果是这种情况,请查看EF Core的播种机制:

更新 根据您发布的附加代码添加更多信息。在您的示例中,您正试图在程序的入口点命中静态种子函数。仍然很难从代码中判断您是否正在构建主机和服务容器,因此我现在假设不是。您可以尝试以下方法:

using System;
using System.IO;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;

public class Program
{
    public static void Main(string[] args)
    {
        var configuration = new ConfigurationBuilder()
            .AddJsonFile(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "appsettings.json")) // Grabs the appsettings JSON as the configuration source
            .Build();

        var dbOptions = new DbContextOptionsBuilder<BlogContext>()
            .UseSqlite(configuration.GetConnectionString("BlogDb"));

        Seed.SeedDatabase(new BlogContext(dbOptions)); // Pass in your prepared DbContext via method injection
        //...
    }
}
使用系统;
使用System.IO;
使用Microsoft.EntityFrameworkCore;
使用Microsoft.Extensions.Configuration;
公共课程
{
公共静态void Main(字符串[]args)
{
var configuration=new ConfigurationBuilder()
.AddJsonFile(Path.Combine(AppDomain.CurrentDomain.BaseDirectory,“appsettings.json”)//获取appsettings json作为配置源
.Build();
var dbOptions=new DbContextOptionsBuilder()
.UseSqlite(configuration.GetConnectionString(“BlogDb”));
Seed.SeedDatabase(newblogcontext(dbOptions));//通过方法注入传入准备好的DbContext
//...
}
}

EF核心seed功能可能仍将帮助您获得更强大的功能。

基于上述代码,似乎在注入依赖项和静态代码方面存在一些混合和匹配,这让您感到头痛。中间的示例希望配置通过构造函数注入来实现,但随后您在静态方法中创建了一个无法使用它的实例

理想情况下,在您的服务注册过程中,您会执行以下操作:

services.AddDbContext<BlogContext>(options => 
    options.UseSqlite(Configuration.GetConnectionString("BlogDb")));
}

更现实地说,看起来您正在尝试为数据库添加种子(duh)。如果是这种情况,请查看EF Core的播种机制:

更新 根据您发布的附加代码添加更多信息。在您的示例中,您正试图在程序的入口点命中静态种子函数。仍然很难从代码中判断您是否正在构建主机和服务容器,因此我现在假设不是。您可以尝试以下方法:

using System;
using System.IO;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;

public class Program
{
    public static void Main(string[] args)
    {
        var configuration = new ConfigurationBuilder()
            .AddJsonFile(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "appsettings.json")) // Grabs the appsettings JSON as the configuration source
            .Build();

        var dbOptions = new DbContextOptionsBuilder<BlogContext>()
            .UseSqlite(configuration.GetConnectionString("BlogDb"));

        Seed.SeedDatabase(new BlogContext(dbOptions)); // Pass in your prepared DbContext via method injection
        //...
    }
}
使用系统;
使用System.IO;
使用Microsoft.EntityFrameworkCore;
使用Microsoft.Extensions.Configuration;
公共课程
{
公共静态void Main(字符串[]args)
{
var configuration=new ConfigurationBuilder()
.AddJsonFile(Path.Combine(AppDomain.CurrentDomain.BaseDirectory,“appsettings.json”)//获取appsettings json作为配置源
.Build();
var dbOptions=new DbContextOptionsBuilder()
.UseSqlite(configuration.GetConnectionString(“BlogDb”));
Seed.SeedDatabase(newblogcontext(dbOptions));//通过方法注入传入准备好的DbContext
//...
}
}

EF核心seed功能可能仍将帮助您获得更强大的功能。

您也应该将DbContext与注入一起使用。请注意,任何要注入的内容都需要作为服务添加。通常可以从
启动
类将类添加为服务。对于DbContext,您可以在
ConfigureServices
方法中使用扩展方法
AddDbContext

services.AddDbContext<BlogContext>();
如果使用此方法,还应记住使用以下构造函数:

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

    public DbSet<Blog> Blogs { get; set; }
}
公共类BlogContext:DbContext
{
公共博客上下文(DbContextOptions)
:基本(选项)
{ }
公共数据库集博客{get;set;}
}
有关此过程的完整文档,请查看以下链接:

EF Core中还内置了数据种子。您可以检查以下内容:

您也应该将DbContext与注入一起使用。请注意,任何要注入的内容都需要作为服务添加。通常可以从
启动
类将类添加为服务。对于DbContext,您可以在
ConfigureServices
方法中使用扩展方法
AddDbContext

services.AddDbContext<BlogContext>();
如果使用此方法,还应记住使用以下构造函数:

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

    public DbSet<Blog> Blogs { get; set; }
}
公共类BlogContext:DbContext
{
公共博客上下文(DbContextOptions)
:基本(选项)
{ }
公共数据库集博客{get;set;}
}
有关此过程的完整文档,请查看以下链接:

EF Core中还内置了数据种子。您可以检查以下内容:

在你的种子课上:

var config = new ConfigurationBuilder()
                 .SetBasePath(Directory.GetCurrentDirectory())
                 .AddEnvironmentVariables()
                 .Build();
var dbContext = new DbContext(config);

在你们班的某个地方:

var config = new ConfigurationBuilder()
                 .SetBasePath(Directory.GetCurrentDirectory())
                 .AddEnvironmentVariables()
                 .Build();
var dbContext = new DbContext(config);

在注册期间配置连接字符串听起来像是一种方法。但是我仍然不知道
IConfiguration
实例在哪里