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

AJ.*_*AJ. 12 linqpad entity-framework-core

我试图找出是否存在我缺少的东西,或者某种方式来解决DbContextsLinqPad中对Entity Framework Core缺乏支持的问题.我已经编译了我的代码目标4.6.1(如LinqPad论坛上建议的)并尝试了"Entity Framework V7"驱动程序,但顾名思义,我不相信它是最新的.它仍然要求app.config文件或构造函数的连接字符串.

添加上下文对话框

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

Fun*_*One 9

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

所以可以添加以下构造函数:

public ApplicationDbContext(string connectionString) 
    : this(new DbContextOptionsBuilder<ApplicationDbContext>()
           .UseSqlServer(connectionString).Options)
    { }
Run Code Online (Sandbox Code Playgroud)

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

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


Ted*_*sen 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);
}
Run Code Online (Sandbox Code Playgroud)

即使您指定“通过接受字符串的构造函数”,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);
}
Run Code Online (Sandbox Code Playgroud)

当然,这是现有public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { }的补充。

编辑:注意,它看起来像覆盖了默认行为,除非您将其部署到服务器,否则它是不可见的。


归档时间:

查看次数:

3004 次

最近记录:

6 年,3 月 前