在DbContext.OnConfiguring和AspCore Startup.ConfigureServices中定义optionsBuilder时,会得到什么结果?

时间:2018-03-29 17:15:46

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

我的ASP.NET核心有这个类首先被调用

public class Startup
{ 
    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
         services.AddDbContext<IssuerContext>(options => 
             options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

        services.AddMvc();
    }

我的背景是:

public class IssuerContext : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        var connString = "Server=(localdb)\\mssqllocaldb;Database=HavenServer;ConnectRetryCount=0;Trusted_Connection=True;MultipleActiveResultSets=true\"";
        optionsBuilder
            .UseLoggerFactory(MyConsoleLoggerFactory)
            .EnableSensitiveDataLogging(false)
            .UseSqlServer(connString, options => options.MaxBatchSize(150));

        base.OnConfiguring(optionsBuilder);
    }

在两个位置定义看似重叠的选项时,预期的SQLServer选项配置是什么?

2 个答案:

答案 0 :(得分:4)

文档的Configuring a DbContext部分对此进行了解释:

  

DbContextOptions可以通过覆盖DbContext方法或通过构造函数参数从外部提供给OnConfiguring

     

如果两者都使用,则OnConfiguring最后应用,并且可以覆盖提供给构造函数参数的选项。

通常,在OnConfiguring覆盖内,您应该检查DbContextOptionsBuilder.IsConfigured属性:

  

获取一个值,该值指示是否已配置任何选项。

     

当您重写OnConfiguring来配置上下文时,这可能很有用,但在某些情况下,您还可以通过上下文构造函数从外部提供选项。此属性可用于确定是否已设置选项,并跳过OnConfiguring中的部分或全部逻辑。

E.g。

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    if (!optionsBuilder.IsConfigured)
    {
        var connString = "Server=(localdb)\\mssqllocaldb;Database=HavenServer;ConnectRetryCount=0;Trusted_Connection=True;MultipleActiveResultSets=true\"";
        optionsBuilder
            .UseLoggerFactory(MyConsoleLoggerFactory)
            .EnableSensitiveDataLogging(false)
            .UseSqlServer(connString, options => options.MaxBatchSize(150));
    }
    base.OnConfiguring(optionsBuilder);
}

答案 1 :(得分:1)

通常,这两个选项都将应用于&#34; OnConfiguring&#34;方法是&#34; 除了配置&#34;来自&#34; ConfigureServices&#34;方法。 ConfigureServices用于为DbContext设置依赖注入,因此它将使用这些选项作为构造函数参数。在OnConfiguring方法中完成的任何其他配置都将附加或覆盖StartUp类的配置。但是,在您提供的示例中,您的DbContext中没有构造函数,因此不会使用Startup类中的配置。

Docs