在DbContext.OnConfiguring和AspCore Startup.ConfigureServices中定义optionsBuilder时,预期的结果是什么?
我的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(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选项配置是什么?
在文档的配置DbContext部分中对此进行了解释:
可以通过重写
OnConfiguring
方法或通过构造函数参数从外部将OnConfiguring
提供给DbContext
。如果两者都使用,则最后应用
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); }
通常,这两个选项都将应用于“OnConfiguring”方法中的配置,该方法是“ConfigureServices”方法中的“除配置之外”。 ConfigureServices用于为DbContext设置依赖项注入,因此它将使用这些选项作为构造函数参数。 在OnConfiguring方法中完成的任何其他配置都将附加或覆盖StartUp类的配置。 但是,在您提供的示例中,DbContext中没有构造函数,因此不会使用Startup类的配置。
文件