Передавать параметр классу, который наследуется от DbContext

Мое приложение - ASP.NET Core 1.0 Web API. Я использую Entity framework.

Я не могу изменить CommandTimeout следующим образом:

public class MyDbContext: DbContext
{
   private const int Timeout = 180;

   public MyDbContext(DbContextOptions options): base(options)
   {
       this.Database.SetCommandTimeout(Timeout);
   }
}

это работает, если Timeout определен в моем классе.

Однако, я хотел бы иметь значение моего Timeout внутри моего файла appsettings.json следующим образом:

  "DbContextSettings": {
    "Timeout": "180"
  }

поэтому есть два способа установить CommandTimeout сейчас:

  • Передайте CommandTimeOutInSeconds в качестве параметра конструктору.
  • Получить значение из appsettings.json внутри конструктора моего класса

Я не знаю, как достичь одного из способов.

Возможно ли это? или существует ли какое-либо известное обходное решение?

Edit

Я никогда не инициализирую MyDbContext. Я делаю это в ConfigureServices в классе Startup следующим образом:

services.AddDbContext<MyDbContext>(db => db.UseSqlServer("secret"));

Изменить 2

@dennisanberlin, так что скажем, у меня есть контроллер, вызывающий следующий метод:

public class SomeRepository
{

  private MyDbContext context;

  public SomeRepository(MyDbContext myContext)
  {
     this.context = myContext;
  }

  public Person SomeMethodCalledByController(){
     return myContext.SomeTableWhichContainsPersons.FirstOrDefault(person => person.name == "Bob");
  }
}

Класс SomeRepository никогда не инициализируется мной. Я делаю это через dependency injection в Startup следующим образом:

services.AddTransient<SomeRepository>();

Класс знает о MyDbContext из приведенной выше строки:

services.AddDbContext<MyDbContext>(db => db.UseSqlServer("secret"));

Поэтому я никогда не передаю объект MyDbContext напрямую ни одному из моих классов, работающих с базой данных.

Ответ 1

Вы можете передать таймаут вашему конструктору, как это:

public MyDbContext(DbContextOptions options, int timeout): base(options)
   {
       Timeout = timeout;
       this.Database.SetCommandTimeout(Timeout);
   }

И вот пример того, как читать настройки из вашего App settings.json csharpcorner

ИЗМЕНИТЬ

public MyDbContext(DbContextOptions options): base(options)
   {
       int timeout = //return timeout setting from appsettings.json
       this.Database.SetCommandTimeout(Timeout);
   }

Вы можете попробовать сделать это таким образом, чтобы прочитать свой appsettings.json внутри своего конструктора.