Мнение о повторном использовании контекста БД в Linq - PullRequest
6 голосов
/ 16 октября 2010

У меня есть класс, который использует linq для доступа к базе данных. Некоторые методы вызывают другие. Например:

class UserManager
{
   public User[] getList()
   {
       using(var db = new MyContext())
       {
             return db.Users.Where(item => item.Active == false);
       }
    }
    public User[] addUser(string name)
    {
       using(var db = new MyContext())
       {
           db.Users.InsertOnSubmit(new User() { id = Guid.NewId(),  name = name, active = false ...});
       }
       return getList();
    }

...

При вызове addUser мне необходимо вернуть новый список. (Я знаю, что это не очень хороший дизайн, но я упустил детали для простоты.) Однако, вызов getList создает второй контекст данных.

Я мог бы дополнить это дополнительными методами, а именно:

public getList()
{
     using(var db = new MyContext())
        return getList(db);
}
public getList(MyContext db)
{
      ...
}

Затем замените мой вызов в addUser, чтобы сохранить тот же контекст данных.

Кажется, я часто вижу подобные вещи в своем коде, и меня беспокоит стоимость создания и выпуска всех этих контекстов данных. У кого-нибудь есть мнение относительно того, стоит ли вкладывать дополнительную работу, чтобы исключить создание и удаление этих контекстов?

Ответы [ 3 ]

6 голосов
/ 16 октября 2010

Microsoft предоставляет следующий совет / рекомендацию не использовать экземпляры DataContext http://msdn.microsoft.com/en-us/library/bb386929.aspx

Часто задаваемые вопросы (LINQ to SQL)

Пул соединений

Q,Существует ли конструкция, которая может помочь с пулами DataContext?

A. Не пытайтесь повторно использовать экземпляры DataContext. Каждый DataContext поддерживает состояние (включая кэш идентификаторов) для одного конкретного сеанса редактирования / запроса.Чтобы получить новые экземпляры на основе текущего состояния базы данных, используйте новый DataContext.

Вы все еще можете использовать базовый пул соединений ADO.NET.Для получения дополнительной информации см. Пул соединений с SQL Server (ADO.NET).

5 голосов
/ 16 октября 2010

Можно повторно использовать для разных частей одной и той же логической операции (возможно, передавая контекст данных в качестве аргумента), но вам не следует многократно использовать намного больше:

  • кеширует объекты; это очень быстро станет слишком большим
  • Вы не должны делиться между потоками
  • как только вы нажмете исключение, будет очень неразумно использовать

Etc. Итак: атомные операции в порядке; долгоживущий контекст приложения; плохой.

1 голос
/ 17 октября 2010

То, что я обычно делаю, - это создаю класс, который можно назвать чем-то вроде DataManager со всеми функциями данных в качестве членов. Этот класс создает экземпляр MyContext в своем конструкторе.

class DataManager
{
   private MyContext db;

   public DataManager() {
       db = new MyContext();
   }

   public User[] getList()
   {
       return db.Users.Where(item => item.Active == false);
   }

   public User[] addUser(string name)
   {
       db.Users.InsertOnSubmit(new User() { id = Guid.NewId(),  name = name, active = false ...});
       return getList();
   }
}

Вы создаете экземпляр этого класса всякий раз, когда выполняете набор операций. Например, на контроллере вы можете иметь этот класс в качестве члена. Только не делайте из этого глобальную переменную, создавайте экземпляры и распоряжайтесь ими, когда закончите.

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