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

Создание экземпляра контекста в LINQ для объектов

Я видел два разных подхода, которые подходят программистам при создании контекста сущности в их коде.

Первое похоже на подобное, и вы можете найти его по всем примерам кода MSDN:

public void DoSomething() {
     using (TaxableEducationEntities context = new TaxableEducationEntities()) {
          // business logic and whatever else
     }
}

Второй заключается в создании контекста как частного атрибута в каком-то классе, который инкапсулирует вашу бизнес-логику. Таким образом, у вас будет что-то вроде:

public class Education_LINQ {

        private TaxableEducationEntities context = new TaxableEducationEntities();

        public void DoSomething() {
            var result = from a in context.luAction
                         select a;

            // business logic and whatever else
        }
}

Какой способ более эффективен?

Предположим, что у вас есть два метода, один из которых называется DoSomething1(), а другой - DoSomething2(), и оба метода включают оператор using, чтобы открыть контекст и делать с ним все. Вы могли бы вызвать один метод за другим, будет ли излишний накладной процесс, так как по существу оба метода создают контекст, а затем очищают его, когда они сделаны? В отличие от наличия только одного частного атрибута, который создается при создании экземпляра объекта класса, а затем, в свою очередь, очищается, когда объект выходит из области видимости?

4b9b3361

Ответ 1

Создание нового объекта ObjectContext каждый раз связано с "некоторыми" накладными расходами. По существу, накладные расходы связаны с копированием метаданных из глобального кэша в метаданные, связанные с конкретным ObjectContext.

Эти накладные расходы относительно незначительны, поэтому часто об этом не стоит беспокоиться, особенно если учесть дополнительную безопасность, присущую шаблону использования.

Для меня какой вариант вы выбираете, зависит от таких вещей, как:

  • Как долго жил ваш может быть, класс упаковки? Если он живет для долгое время ObjectContext мог расти, чтобы удерживать много сущностей замедляя со временем. Итак, новый ObjectContext каждый раз может быть хорошая идея.
  • Вызов методов в вашем классе упаковки синхронизируется? ObjectContext сам класс не является потокобезопасным, поэтому, если вы используете второй шаблон, который вам нужен чтобы убедиться, что ваш класс упаковки/ хранилище является потокобезопасным, если вы ожидайте, что несколько потоков вызовут его.
  • Являются ли методы по существу не связаны? Если это так, вы можете получить неожиданные побочные эффекты, если они разделяют один контекст между методами.

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

Если у вас относительно короткая живая форма или что-то еще, возможно, общий контекст - это лучшая идея.

ОБНОВЛЕНИЕ: я потратил время, чтобы собрать более полный ответ

Ответ 2

Второй вариант фактически не очищает после себя, если это то, что вы имеете в виду. Я предпочитаю использовать ObjectContext-версию каждый раз, потому что мне не нужно ее уничтожать. Не уверен, что я получил вопрос правильно, хотя... Слишком много часов программирования сегодня.

public class UserManagerRepository : IUserManagerRepository, IDisposable
{
    private readonly Entities _context = new Entities();
    private bool _disposed;

    public User Create(User user, int countryId)
    {
        user.Country = GetCountry(countryId);
        _context.AddToUser(user);
        _context.SaveChanges();
        return user;
    }
}

Затем, чтобы использовать этот репозиторий, я делаю что-то вроде:

using(var repository = new UserManagerRepository())
{
    repository.Create(user);
}