Сохранить один общий DataContext для каждого DAL вместо того, чтобы создавать его для каждого вызова базы данных? - PullRequest
0 голосов
/ 02 марта 2012

В моих DAL в настоящее время я использую новый экземпляр DataContext для каждого метода, то есть создаю контекст для каждого вызова данных, а затем располагаю его (с помощью using).Я помню, что я читал, что это было своего рода лучшей практикой.

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

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

Ответы [ 2 ]

1 голос
/ 11 марта 2012

Из того, что я прочитал, и из своего собственного вывода, основное правило: использовать один экземпляр DataContext для каждого короткого набора операций , это означает:

  1. Использовать новый (отдельный) экземпляр DataContext для каждой операции (транзакции) в долгоживущих родительских объектах , таких как DAL. Например, основная форма имеет DAL, который использует DataContext, основная форма является наиболее долгоживущим объектом в настольном приложении, поэтому наличие единственного экземпляра DataContext для обслуживания всех операций с данными основной формы не будет хорошим решением. из-за увеличения кэша и риска устаревания данных.

  2. Использовать один (общий) экземпляр DataContext для всех операций с живыми родительскими объектами за короткое время. Например, если у нас есть класс, который выполняет набор операций с данными за короткое время время, такое как получение данных из базы данных, работа с ними, их обновление, сохранение изменений в базе данных и их удаление, мы лучше создадим один экземпляр DataContext и используем его во всех методах DAL. Это относится и к веб-приложениям и сервисам, так как они не сохраняют состояния и выполняются по запросу.

Пример, когда я вижу требование общего DataContext:

DAL:

// Common DAL DataContext field.
DataContext Context = new DataContext();

public IEnumerable<Record> GetRecords()
{
    var records = Context.Records;

    foreach (var record in records)
    {
        yield return record;
    }    
}

public void UpdateData()
{
    Context.SaveChanges();
}

BLL:

public void ManageData()
{
    foreach (var record in DAL.GetRecords())
    {
         record.IsUpdated = true;
         DAL.UpdateData();
    }
}
0 голосов
/ 02 марта 2012

При таком подходе вы получите много объектов, созданных в памяти (потенциально, весь БД) и (что может быть еще более важно), эти объекты не будут соответствовать текущим значениям в БД (если БДобновляется за пределами вашего приложения / машины).Поэтому, чтобы эффективно использовать память и иметь актуальные значения для ваших сущностей, действительно лучше создавать контекст данных для каждой транзакции.

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