Как безопасно использовать объект DBConnection EF Core Context - PullRequest
1 голос
/ 16 апреля 2020

По какой-то причине я хочу получить объект DBConnection объекта DBContext.

Поскольку DBConnection, DBCommand и DBDataReader являются одноразовыми, я использовал их следующим образом:

public static void Query(DBContext context)
{
    using var conn = context.Database.GetDbConnection();
    conn.Open();
    using var cmd = conn.CreateCommand();
    // do something
    using var reader = cmd.ExecuteReader();
    // do something
}

Когда этот метод был завершен, я хотел использовать объект DBContext в другом методе. И затем объект DBContext ошибся с InvalidOperationException : свойство connectionstring не было инициализировано

Я пытаюсь получить DBConnection в следующем методе, который вызвал это исключение, и обнаружил, что свойство State было " Закрыто ".

Возвращает ли метод context.DataBase.GetDbConnection() один и тот же экземпляр каждый раз?

Если я не добавлю , используя перед объектом conn, например:

var conn = context.Database.GetDbConnection();
using var cmd = conn.CreateCommand();
// something just the same as above

Все в порядке.

Могу ли я просто сделать не утилизировать объект DBConnection после его использования, если у объекта DBContext есть другие дела?

Это безопасно?

Кстати, объект DBContext объявлен using.

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Могу ли я просто не утилизировать объект DBConnection после его использования, если у объекта DBContext есть другие дела?

Безопасно ли это?

Это правильный способ сделать это, и это безопасно. Не беспокойтесь о DbConnection, пока DbContext будет удален, он закроет и утилизирует связанный DbConnection для вас.

0 голосов
/ 16 апреля 2020

Примечание. Если вы используете EF Core 3.0, вы можете использовать «.FromSqlRaw ()» вместо .CreateCommand ().

using (var context = new DatabaseContext())
{
    var result= context.ExampleTable.FromSqlRaw("SELECT Id, Name FROM ExampleTable").ToList();
}

Параметризованные запросы возможны с

var result= context.ExampleTable.FromSqlRaw("SELECT * From ExampleTable Where Id= {0}", id).FirstOrDefault();

см. https://docs.microsoft.com/de-de/ef/core/querying/raw-sql для получения более подробной информации

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