Как выполнить необработанный sql-запрос с помощью DbContext (одно соединение на запрос)?

#c# #entity-framework

#c# #entity-framework

Вопрос:

В настоящее время я следую этим инструкциям о том, как выполнить запрос с использованием необработанного sql в ef.

https://learn.microsoft.com/en-us/ef/ef6/querying/raw-sql

Возможно ли выполнить необработанный sql-запрос на чтение в контексте базы данных таким образом, чтобы мы были уверены, что используем только одно соединение с базой данных во время обработки запроса.

Аналогично этому, но с DbContext вместо IDbConnection.

 public class SqlConnectionFactory : ISqlConnectionFactory, IDisposable
    {
        private readonly string _connectionString;
        private IDbConnection _connection;

        public SqlConnectionFactory(string connectionString)
        {
            this._connectionString = connectionString;
        }

        public IDbConnection GetOpenConnection()
        {
            if (this._connection == null || this._connection.State != ConnectionState.Open)
            {
                this._connection = new SqlConnection(_connectionString);
                this._connection.Open();
            }

            return this._connection;
        }

        public void Dispose()
        {
            if (this._connection != null amp;amp; this._connection.State == ConnectionState.Open)
            {
                this._connection.Dispose();
            }
        }
    }
  

Комментарии:

1. Может быть, вы хотите вручную открыть транзакцию перед первым запросом и зафиксировать утилизировать после последнего запроса. В противном случае я, вероятно, не понимаю актуальной проблемы, которую вы пытаетесь здесь решить (однако, поскольку вы говорите о чтениях, фиксация транзакции на самом деле не имеет смысла). На самом деле, не имеет смысла обеспечивать одно открытое соединение, когда мы говорим только о чтении — не так ли?

2. Как вы думаете, почему не имеет смысла запрещать открывать x соединений с БД для x операций чтения?

3. Я думаю, что не имеет смысла применять это поведение в вашем коде. Многие провайдеры выбирают пул соединений по умолчанию на низком уровне, поэтому велика вероятность, что вы на самом деле работаете с одним открытым соединением, когда просто запускаете свои запросы и игнорируете детали. Итак, если у вас действительно проблема с низкой скоростью соединения, возможно, стоит разобраться. Но если вы просто предполагаете , что вам следует вручную обработать ваше соединение, то вы, вероятно, тратите свое и чужое время без необходимости.