当前位置:  开发笔记 > 前端 > 正文

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

如何解决《有没有办法让LinqPad使用EFCore上下文?》经验,为你挑选了2个好方法。

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

添加上下文对话框

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



1> FunkyOne..:

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

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

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

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

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



2> Tedd Hansen..:

该驱动程序似乎有错误/根本没有更新。我找到了一种通过修改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 options) : base(options) { }的补充。

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

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有