2017-01-20 54 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中,以使其永不生产。

相关问题