【问题标题】:How to get ConnectionString from EF7 DbContext如何从 EF7 DbContext 获取 ConnectionString
【发布时间】:2015-10-14 13:54:49
【问题描述】:

我的场景:

我将 EF7 用于标准 CRUD 操作,将 Dapper 用于需要提高速度的更复杂的查询。从 startup.cs 我将我的DbContext 注入我的 DAL 中,这显然会执行数据库查询。 Dapper 需要一个连接字符串。我想将我的 EF7 DbContext 连接字符串注入 Dapper 查询。

我的问题:

如何像以前一样从 DbContext 中获取连接字符串:DbContext.Database.Connection

它在 EF7 中从 Database 更改为 DatabaseFacade 类型,随之,DbConnection Connection 也被删除了。

DbContext 中肯定应该有一些我可以查询的持久连接字符串?

我的研究:

我目前使用的方法是,并且有效:

public partial class CustomContext : DbContext
{
    public readonly string _connectionString;

    public CustomContext (DbContextOptions options)
        : base(options)
    {
            _connectionString = ((SqlServerOptionsExtension)options.Extensions.First()).ConnectionString;
    }
}

我知道它仍处于测试阶段,但我是否遗漏了什么?

感谢您的宝贵时间。

【问题讨论】:

  • 仅供参考,我正在使用 EF7 的 beta7。
  • 旁注:您应该考虑使用 .FromSql(query) 和 .AsNoTracking() 方法来提高 EF 的查询速度,这样您就不需要在一个项目中使用 Dapper + EF。
  • 你引导我正确。这适用于 me.ctor: public DbContext(DbContextOptions options) : base(options) { this.Database = new DatabaseFacade(this); }

标签: c# asp.net-core asp.net-core-mvc entity-framework-core


【解决方案1】:

我搜索了 EF7 sources,看来您当前的方法是正确的。

连接字符串存储在SqlServerOptionsExtension 中。当你调用UseSqlServer(connectionString)the code如下(只提取有趣的行):

var extension = options.FindExtension<SqlServerOptionsExtension>()
extension.ConnectionString = connectionString;

我不确定为什么要从明显的地方删除连接字符串,但可能是开发人员抽象出连接字符串以允许我们使用非标准数据库(如内存数据库等)。

这看起来更清晰 IMO:

Configuration.Get("Data:ConnectionString")

【讨论】:

    【解决方案2】:

    如果你有一个完全物化的上下文,你也可以使用这个:

     var conn = context.Database.GetDbConnection();
     ConnectionString = conn?.ConnectionString;
     conn?.Dispose();
    

    【讨论】:

    • 这很好用,但请记住,打开连接后密码将不再可用,除非连接字符串中的 Persist Security Info 设置为 true。
    猜你喜欢
    • 2013-03-19
    • 2015-01-25
    • 1970-01-01
    • 2016-03-14
    • 2016-05-05
    • 2021-08-31
    • 2017-06-09
    • 2022-06-16
    • 1970-01-01
    相关资源
    最近更新 更多