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

时间:2017-06-08 05:50:51

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

我的申请是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

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

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

    这可能吗?或者有任何已知的解决方法吗?

    修改

    我从未真正宣传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 个答案:

答案 0 :(得分:2)

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

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。