EF Core контекст открывает соединение после того, как оператор using закрывает его - PullRequest
1 голос
/ 17 июня 2019

В приложении .NET core web api я использую ef core в функции, для которой мне нужно запустить какой-нибудь raw sql, а затем, когда я пытаюсь использовать контекст после raw sql, он не работает.

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

DbConnection conn = _context.Database.GetDbConnection();
using (conn)
{
   await conn.OpenAsync();
   using (DbCommand cmd = conn.CreateCommand())
   {
      //Raw SQL                
   }
}
Table1 t1 = await _context.Table1
      .Where(i => i.id == 1)
      .SingleOrDefaultAsync();

Все работает нормально, пока приложение не доходит до строки Table1 t1, тогда я получаю ошибку

Я получаю ошибку

InvalidOperationException: The ConnectionString property has not been initialized. System.Data.SqlClient.SqlConnection.PermissionDemand()

Редактировать

Я спрашиваю, есть ли лучший способ запуска необработанного SQL, который возвращает данные, которые не сопоставлены с сущностью, и затем продолжает использовать EF Core. Также иногда мой сырой SQL возвращает только строку или десятичное значение

Редактировать # 2

Спасибо за помощь, я буду использовать предложение, сделанное Иван Стоев

Обновлен рабочий код

DbConnection conn = _context.Database.GetDbConnection();
await context.Database.OpenConnectionAsync();
using (DbCommand cmd = conn.CreateCommand())
{
   //Raw SQL                
}
context.Database.CloseConnection();
Table1 t1 = await _context.Table1
      .Where(i => i.id == 1)
      .SingleOrDefaultAsync();

1 Ответ

1 голос
/ 17 июня 2019

Вы using соединение, которое вызывает Dispose и закрывает соединение в конце блока using.Нет необходимости в этом using, просто удалите его.Однако, похоже, что вы пытаетесь запустить необработанную команду SQL в базе данных, EF Core уже имеет такую ​​возможность, например:

await _context.Database.ExecuteSqlCommandAsync("DELETE FROM SomeTable");

Есть также некоторые FromSql методы, специфичные для DbSet s.

...