2017-01-20 53 views
6

我想弄清楚我是否缺少某種方式來解決LinqPad中實體框架核心DbContexts缺乏支持(還)的問題。我已經將我的代碼編譯爲4.6.1(作爲suggested on the LinqPad forum),並嘗試使用「Entity Framework V7」驅動程序,但正如其名稱所示,我不相信它是最新的。它仍然要求爲構造函數提供app.config文件或連接字符串。有沒有辦法讓LinqPad與EF Core上下文一起工作?

Add context dialog

由於EF核心上下文使用DbContextOptions建設,而不是連接字符串,我想我可能創建一個構造函數重載需要一個連接字符串,但不處理底層數據庫驅動程序。有沒有辦法指定一個工廠來構建上下文?任何其他可能性?沒有LinqPad,我感覺很失落。

回答

2

驅動程序似乎是越野車/根本沒有更新。我找到了一種通過修改DbContext來繞過它的方法。

從理論上講,這應該有工作,但它並不:

private string _connectionString; 
public ApplicationDbContext(string connectionString) : base() 
{ 
    _connectionString = connectionString; 
} 
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
{ 
    if (_connectionString == null) 
     base.OnConfiguring(optionsBuilder); // Normal operation 

    // We have a connection string 
    var dbContextOptionsBuilder = new DbContextOptionsBuilder(); 
    optionsBuilder.UseSqlServer(_connectionString); 
    base.OnConfiguring(dbContextOptionsBuilder); 
} 

LinqPad EF核心驅動器仍然在尋找即使您指定「通過接受字符串構造」的參數的構造函數。這似乎是司機中的一個錯誤。

所以然後我給它它想要的,一個無參數的構造函數。由於IoC/appsettings.json配置讀取器沒有加載,我不得不硬編碼連接字符串,我不想在DbContext中單獨加載。但它的工作原理讓我可以在我的模型中測試LinqPad中的EF Core查詢。

也能正常工作對我來說:

private bool _isDebug = false; 
public ApplicationDbContext() : base() 
{ 
    _isDebug = true; 
} 
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
{ 
    if (!_isDebug) 
     base.OnConfiguring(optionsBuilder); // Normal operation 

    // We are in debug mode 
    var dbContextOptionsBuilder = new DbContextOptionsBuilder(); 
    // Hardcoded connection string 
    optionsBuilder.UseSqlServer("data source=XXXX;initial catalog=XXXX;persist security info=True;user id=XXXX;password=XXXX;MultipleActiveResultSets=True;App=EntityFramework"); 
    base.OnConfiguring(dbContextOptionsBuilder); 
} 

這是除了當然的現有public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { }

編輯:請注意,它看起來像覆蓋了默認行爲,在部署到服務器之前它可能不可見。

3

最新的EFCore 1.1 LINQPad驅動程序(v1.1.1.1)可以正確使用接受字符串的構造函數(在LINQPad中選擇此選項時)。

所以這是可以添加下面的構造:

public ApplicationDbContext(string connectionString) : this(new DbContextOptionsBuilder<ApplicationDbContext>() 
     .UseSqlServer(connectionString).Options) 
    { } 

這將這個上下文實例硬連接到SQL Server提供者,但至少不能連接字符串。此外,您的應用程序不可能嘗試使用此構造函數,EF Core從不期望/推廣ctor。接受字符串。

爲了更加安全,您可以將此構造函數包裝在#if DEBUG ... #endif中,以使其永不生產。

相關問題