【问题标题】:Pass parameter to class which inherits from DbContext将参数传递给从 DbContext 继承的类
【发布时间】:2017-06-08 16:56:13
【问题描述】:

我的申请是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. 在我的类的构造函数中从appsettings.json 中获取值

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

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

编辑

我从来没有真正初始化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 类永远不会被我初始化。我通过dependency injectionstartup 中这样做,如下所示:

services.AddTransient<SomeRepository>();

班级从上面显示的行中知道MyDbContext

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

因此,我从不将MyDbContext 的对象直接传递给我的任何使用数据库的类。

【问题讨论】:

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


    【解决方案1】:

    您可以像这样将超时传递给您的构造函数:

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

    这是一个关于如何从您的应用 settings.json csharpcorner 读取设置的示例

    编辑

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

    您可以尝试这样做,即在构造函数中读取 appsettings.json。

    【讨论】:

    • 但是如何将超时传递给构造函数?我从不初始化 MyDbContext,请参阅我的编辑
    • 也许你可以在你的 AddDb 方法之前初始化它。
    • 在我的 sql 数据库上的每个请求都会调用构造函数,因此设置一次值可能不起作用
    • 喜欢'MyDbContext dbcontext = new MyDbContext(paramater);'
    • 正如我所说,类的构造函数在数据库上的每个 sql 语句中都被称为我的实体框架本身。我不能自己调用​​构造函数。即使我愿意,我也必须在每次数据库调用时都这样做,这就像 3000 行代码,我什至不确定它是否会工作
    猜你喜欢
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 2014-06-05
    • 1970-01-01
    • 2020-04-26
    相关资源
    最近更新 更多