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

Как создать DAL, используя petapoco

Мне нужно создать DAL и репозитории, используя petapoco. Трудность, которая возникает, заключается в том, что я не знаю, как она управляет своими соединениями.

Если я использовал dapper, я знаю, как происходит процесс подключения, потому что я его контролирую. Я не знаю, каковы наилучшие методы создания DAL с петапоко.

 public class UserRepository
    {
        public IEnumerable<User> All()
        {
            var db = new PetaPoco.Database("Sqlite_Connection");//this line
            var s = db.Query<User>("SELECT * FROM Users");
            return s.ToList();
        }
    }

Я хотел бы разместить var db = new PetaPoco.Database("Sqlite_Connection");//this line в моем классе DALHelper как статическое свойство, но я беспокоюсь о масштабируемости

4b9b3361

Ответ 1

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

Два варианта:

1. Создайте соединение в базовом классе контроллера

public class BaseController : Controller 
{
  protected DatabaseWithMVCMiniProfiler _database;

  protected override void OnActionExecuting(ActionExecutingContext filterCon ) 
  {
    base.OnActionExecuting( filterCon );

    _database = new DatabaseWithMVCMiniProfiler( "MainConnectionString");

  }
}

2. Статический метод, создающий одно соединение для запроса

public static class DbHelper {
  public static Database CurrentDb() {
    if (HttpContext.Current.Items["CurrentDb"] == null) {
       var retval = new DatabaseWithMVCMiniProfiler("MainConnectionString");
       HttpContext.Current.Items["CurrentDb"] = retval;
       return retval;
    }
    return (Database)HttpContext.Current.Items["CurrentDb"];
  }
}

Ответ 2

Статическое свойство будет корректно для инициализации. PetaPoco будет открывать и закрывать соединение каждый раз, если вы не используете транзакцию. Обычно это не проблема из-за пула соединений.

Если вы используете это в веб-приложении, вы должны создать экземпляр одной базы данных PetaPoco для каждого запроса.