Почему я получаю сообщение об ошибке «Свойство ConnectionString не было инициализировано» при первом вызове хранимой процедуры с помощью Entity Framework Core? - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть служба в ASP.NET Core, в которую я вставляю свой контекст Entity Framework Core, который используется для определения частного функционала, который понадобится моей службе.Эта функция предназначена для вызова хранимой процедуры.

Первый вызов этой функции систематически приводит к ошибке

Свойство ConnectionString не было инициализировано.

Однако с последующими вызовами все в порядке.

Вот конструктор класса обслуживания:

private readonly Func<Task<long>> _myFunc;

public MyService(MyContext context) => _myFunc= async () =>
    {
        using (var connection = context.Database.GetDbConnection())
        {
            await connection.OpenAsync();

            using (var command = connection.CreateCommand())
            {
                command.CommandType = CommandType.StoredProcedure;
                command.CommandText = "sp_MyStoredProcedure";
                command.Parameters.Add(new SqlParameter("@AParameter", SqlDbType.Int) { Value = 1 });
                return (long)await command.ExecuteScalarAsync();
            }
        }
    };

Вот это stacktrace:

System.InvalidOperationException: Свойство ConnectionString не было инициализировано.

в System.Data.SqlClient.SqlConnection.PermissionDemand ()
в System.Data.SqlClient.SqlConnectionFactory.PermissionDemand (DbConnection outerConnection)
в системе.Data.ProviderBase.DbConnectionInternal.SqlConnection.OpenAsync (CancellationToken cancellationToken) --- Конец трассировки стека из предыдущего местоположения, где было сгенерировано исключение --- в Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenDbConnectionAsync (логические ошибки Expected, CancellationToken cancellationToken)

ОБНОВЛЕНИЕ:

Когда я устанавливаю точку останова в строке await connection.OpenAsync() и смотрю на переменную connection, строка соединения там и корректна.

Обратите внимание, что MyServices вводится в конструктор контроллера.Регистрация услуги осуществляется следующим образом: startup.cs:

services.AddTransient<IMyService, MyService>();

1 Ответ

0 голосов
/ 09 июля 2019

Старайтесь не утилизировать соединение, как указано в https://stackoverflow.com/a/10911844/532575.

Итак, в общем, замените using (var connection = context.Database.GetDbConnection()) на var connection = context.Database.GetDbConnection() и посмотрите, поможет ли это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...