繁体   English   中英

将参数传递给从DbContext继承的类

[英]Pass parameter to class which inherits from 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则此方法有效。

但是,我想在我的appsettings.json文件中包含Timeout的值,如下所示:

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

因此,有两种方法可以立即设置CommandTimeout

  1. CommandTimeOutInSeconds作为参数传递给构造函数。
  2. 从类的构造函数中的appsettings.json获取值

我不知道如何实现其中一种方法。

这可能吗? 还是有任何已知的解决方法?

编辑

我从来没有真正Initailizing MyDbContext 我在Startup类的ConfigureServices中执行以下操作:

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类。 我在startup通过dependency injection来做到这一点,如下所示:

services.AddTransient<SomeRepository>();

该类从上面显示的行知道MyDbContext

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

因此,我永远不会将MyDbContext的对象直接传递MyDbContext数据库一起使用的任何类。

您可以将超时传递给您的构造函数,如下所示:

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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM