在DbContext.OnConfiguring和AspCore Startup.ConfigureServices中都定义了optionsBuilder时,预期的结果是什么?

goo*_*ate 3 c# entity-framework-core asp.net-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();
    }
Run Code Online (Sandbox Code Playgroud)

我的情况是这样的:

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);
    }
Run Code Online (Sandbox Code Playgroud)

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

Iva*_*oev 6

在文档的“ 配置DbContext”部分中对此进行了解释:

DbContextOptions可被提供给所述DbContext通过重写OnConfiguring方法或通过构造器参数外部。

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

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

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

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

例如

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);
}
Run Code Online (Sandbox Code Playgroud)

  • 看起来 `DbContextOptionsBuilder.IsConfigured` 总是 **false**,尽管 Startup.cs 中使用了 `services.AddDbContext`。任何想法? (3认同)