2017-01-02 103 views
-1

僅用於測試,我不想從StartUp.cs文件執行依賴項注入。 如何從EF Core DBContext獲取IHostingEnvironment。如何從ASP.NET Core中的DbContext獲取IHostingEnvironment

我帶一個新的空模板的asp.net核心項目。我已經創建瞭如下的dbcontext。我想要使​​用Environment.ContentRootPath而不是Directory.GetCurrentDirectory()。但我不想從Startup.cs中進行任何注入。

public class MyDBContext: DbContext 
{ 

    public IConfigurationRoot Configuration { get; set; } 
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
    { 
     var builder = new ConfigurationBuilder() 
       .SetBasePath(Path.Combine(Directory.GetCurrentDirectory(), "..\\..\\..")) 
       .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); 
     Configuration = builder.Build(); 
     optionsBuilder.UseSqlServer(Configuration.GetConnectionString("SQLCN"));// @"Server=(localdb)\mssqllocaldb;Database=MyDatabase;Trusted_Connection=True;"); 
    } 

    public DbSet<Teacher> Teachers { get; set; } 
    public DbSet<Lesson> Lessons { get; set; } 
} 

如果我在下面的DbContext構造函數添加IHostingEnvironment,

public class MyDBContext: DbContext 
{ 
    private readonly IHostingEnvironment env; 
    public MyDBContext(IHostingEnvironment env) : base() 
    { 
     this.env = env; 
    } 


    public IConfigurationRoot Configuration { get; set; } 
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
    { 
     var builder = new ConfigurationBuilder() 
       .SetBasePath(this.env.ContentRootPath) 
       .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); 
     Configuration = builder.Build(); 
     optionsBuilder.UseSqlServer(Configuration.GetConnectionString("SQLCN"));// @"Server=(localdb)\mssqllocaldb;Database=MyDatabase;Trusted_Connection=True;"); 
    } 

    public DbSet<Teacher> Teachers { get; set; } 
    public DbSet<Lesson> Lessons { get; set; } 
} 

我得到了以下錯誤,當我加入遷移從包管理器控制檯。

PM> Add-Migration InitMyDBContext 

無參數的構造函數是在 'MyDBContext' 找到。在'MyDBContext'中添加一個 無參數構造函數,或在 'MyDBContext'相同的程序集中添加一個實現 'IDbContextFactory'。

+0

提供問題和預期行爲的[mcve],以便可以導出解決方案。 – Nkosi

+0

親愛的@Nkosi,我更新了我的問題。先謝謝了。這個問題不是生產問題,只是爲了學習。 –

+0

我還不清楚您的意思是不想從啓動時進行任何注入?請澄清一下。實際上,您可以直接將IHostingEnvironment注入到dbcontext的構造函數中。 – Nkosi

回答

0

您應該能夠將IHostingEnvironment直接注入到DbContext的構造函數中。

public class MyDBContext: DbContext { 
    private readonly IHostingEnvironment env; 
    public MyDBContext(IHostingEnvironment env) : base() { 
     this.env = env; 
    } 

    public IConfigurationRoot Configuration { get; set; } 
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { 
     var builder = new ConfigurationBuilder() 
      .SetBasePath(env.ContentRootPath) 
      .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); 
     Configuration = builder.Build(); 
     optionsBuilder.UseSqlServer(Configuration.GetConnectionString("SQLCN"));// @"Server=(localdb)\mssqllocaldb;Database=MyDatabase;Trusted_Connection=True;"); 
    } 

    public DbSet<Teacher> Teachers { get; set; } 
    public DbSet<Lesson> Lessons { get; set; } 
} 

該框架已經知道該接口。

照常添加上下文。減配置,如您曾表示不想初始化上下文時,該框架應注入的IHostingEnvironment實現爲基於構造函數參數存在的情況下做到這一點在Startup

services.AddDbContext<MyDBContext>(); 

+0

我得到錯誤「MyDBContext上沒有找到無參數的構造函數」,或者在「MyDBContext」中添加無參數構造函數或在同一個程序集中添加「IDbContextFactory」實現作爲'MyDBContext'。「 –

+0

並且您是否閱讀了我的關於查看文檔的評論 – Nkosi

+0

親愛的@Nkosi,是的,我閱讀過那篇文章。我閱讀那篇文章後即將問世。我想從dbcontext類中讀取Environment.ContentRootPath,而不是硬代碼連接字符串。 –

相關問題