如何从 EF7 DbContext 获取 ConnectionString

Posted

技术标签:

【中文标题】如何从 EF7 DbContext 获取 ConnectionString【英文标题】:How to get ConnectionString from EF7 DbContext 【发布时间】: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); 【参考方案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。

以上是关于如何从 EF7 DbContext 获取 ConnectionString的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET vNext EF7 dbContext 问题

如何使用 ASP.NET Core 从 DbContext 中的 JWT 获取用户名?

在带有 EF7 的 ASP.NET5.0 中添加连接字符串以使用 dll 存储库库(基于 EF6)

如何在静态方法或控制器外的类中获取applicationDbContext的dbContext

csharp 从DbContext获取SqlConnection

如何使用 Net Core 在 DbContext 中获取用户信息