Подтвердить что ты не робот

Как получить ConnectionString из EF7 DbContext

Мой сценарий:

Я использую EF7 для стандартных операций CRUD и Dapper для более сложных запросов, требующих увеличения скорости. Начиная с startup.cs, я вставляю свой DbContext в свой DAL, который, очевидно, выполняет запросы к базе данных. Для Dapper требуется строка подключения. Я хочу ввести строку подключения Eb7 DbContext в запрос Dapper.

Мой вопрос:

Как получить строку соединения из DbContext, как раньше: DbContext.Database.Connection?

Он изменился с Database на DatabaseFacade в EF7, и с этим также удалился DbConnection Connection.

Возможно, в DbContext должна быть какая-то постоянная строка соединения, которую я могу запросить?

Мои исследования:

Метод, который я использую в данный момент, работает, и он работает:

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

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

Я знаю его все еще в бета-версии, но я что-то упускаю?

Спасибо за ваше время.

4b9b3361

Ответ 1

Я искал EF7 источники и кажется, что вы правы с вашим текущим подходом.

Строка подключения хранится в SqlServerOptionsExtension. Когда вы вызываете UseSqlServer(connectionString) код следующим образом (извлекаете только интересные строки):

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

Я не уверен, почему строка подключения была удалена с очевидного места, но может быть, что разработчики отменили строку подключения, чтобы мы могли использовать нестандартные базы данных (например, в базе данных и т.д.).

Это выглядит намного яснее IMO:

Configuration.Get("Data:ConnectionString")

Ответ 2

Если у вас есть полностью материализованный контекст, вы также можете использовать это:

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