有没有办法让LinqPad使用EF Core上下文?

时间:2017-01-20 21:41:34

标签: entity-framework-core linqpad

我正在试图弄清楚我是否缺少某些内容或者某种方式来解决LinqPad中实体框架核心DbContexts缺乏支持的问题。我已经编译了我的代码,目标是4.6.1(作为suggested on the LinqPad forum)并尝试了#34; Entity Framework V7"司机,但顾名思义,我不相信它是最新的。它仍然要求app.config文件或构造函数的连接字符串。

Add context dialog

由于EF Core上下文使用DbContextOptions来构造而不是连接字符串,我以为我可能会创建一个带有连接字符串的构造函数重载,但是它不会处理底层数据库驱动程序。有没有办法指定工厂来构建上下文?还有其他可能吗?没有LinqPad,我感到很失落。

2 个答案:

答案 0 :(得分:6)

最新的EFCore 1.1 LINQPad驱动程序(v1.1.1.1)可以正确使用接受字符串的构造函数(在LINQPad中选择此选项时)。

因此可以添加以下构造函数:

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

这会将此上下文实例硬链接到sql server provider,但至少不会连接到字符串。此外,您的应用程序不太可能尝试使用此构造函数,EF Core永远不会期望/促进ctor。接受字符串。

为了更加安全,您可以将此构造函数包装在#if DEBUG ... #endif中,以便它永远不会生成。

答案 1 :(得分:5)

驱动程序似乎有错误/根本没有更新。我找到了一种通过修改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 Core驱动程序仍会继续查找无参数构造函数。这似乎是驱动程序中的一个错误。

然后我给了它想要的东西,一个无参数的构造函数。我不得不硬编码连接字符串,因为没有加载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) { }的补充。

编辑:请注意,它看起来会覆盖默认行为,在您部署到服务器之前可能无法看到这种行为。