none
Linq to SQL и DataContext RRS feed

  • Вопрос

  • Приветствую!

    Какой вариант использования DataContext будет правильнее - создать один на всё приложение или пересоздавать при необходимости?

    Так же не совсем понятно как правильно поддерживать актуальность информации из базы.

    Буду очень признателен за помощь.

    6 декабря 2012 г. 19:22

Ответы

  • Из опыта:

    1. Метод Refresh() работает заметно медленнее, чем создание нового контекста. Поэтому если данные выводятся где-то в одном месте интерфейса (DataGrid какой-нибудь), то лучше пересоздавать после изменений в источнике данных.

    2. Если же требуется в окне одновременно отображать одни и те же данные в разных вариантах (например древовидный список плюс расшифровка одного из его узлов в списке и плюс ещё какие-нибудь атрибуты в боковой панели), то вариант с одним контекстом данных (в виде поля уровня класса) удобнее, так как изменения во всех частях интерфейса синхронизируются автоматически.

    Кроме того, на заре развития L2SQL были рекомендации о полезности периодического пересоздания контекста из-за утечек памяти...

    • Помечено в качестве ответа andreas-hml 9 декабря 2012 г. 7:16
    7 декабря 2012 г. 16:45
  • "Какой вариант использования DataContext будет правильнее - создать один на всё приложение или пересоздавать при необходимости?" - придерживайтесь принципа, чем меньше - тем лучше. Если это конечно возможно. На самом деле траты ресурсов по созданию объекта ничтожны. Проблема производительности кроется в запросах к БД. И тут, по мере возможностей, чем их меньше, тем лучше. Т.е. например лучше получить порцию данных за раз, чем скажем делать два запроса и открыть два соединения разом.

    "Так же не совсем понятно как правильно поддерживать актуальность информации из базы." - через определённые промежутки времени запрашивать их снова. Но вызывайте только данные тех сущностей которые нужны, а не все.

    • Помечено в качестве ответа andreas-hml 7 декабря 2012 г. 6:27
    7 декабря 2012 г. 5:45
    Модератор
  • Для обновления обьектов есть метод Refresh http://msdn.microsoft.com/ru-ru/library/bb534217.aspx

    посмотрите скорее всего это то что вам нужно

    • Помечено в качестве ответа andreas-hml 7 декабря 2012 г. 6:27
    7 декабря 2012 г. 5:47

Все ответы

  • Не совсем понятно что вы подразумеваете под созданием контекста одного для всех приложений, и что вы подразумеваете под актуальностью?

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

    • Помечено в качестве ответа andreas-hml 6 декабря 2012 г. 20:04
    • Снята пометка об ответе andreas-hml 6 декабря 2012 г. 20:11
    6 декабря 2012 г. 19:49
  • DataContext предназначен для одной "единицы работы" вне зависимости от того, как приложение определяет этот термин.

    Ок, с первым вопросом яснее, но что в таком случае делать с обновлением? Заменяем старые объекты новыми, при необходимости вручную сверяя IDы?



    • Изменено andreas-hml 6 декабря 2012 г. 19:53
    • Помечено в качестве ответа andreas-hml 6 декабря 2012 г. 20:04
    • Снята пометка об ответе andreas-hml 6 декабря 2012 г. 20:11
    6 декабря 2012 г. 19:50
  • в ручную в файлы контекста лучше не лазить, дизайнер их перезапишет при первом же случае, лучше через дизайнеры студии это делать
    6 декабря 2012 г. 19:56
  • Не не, я не о том.

    Допустим я получаю коллекцию объектов, которая потом биндится к датагриду. Привязанный к выделенной строке объект я использую для каких-то своих целей в других элементах управления, окнах и т.п. 

    Теперь настало время обновить изначальную коллекцию объектов (допустим автоматически через промежуток времени). Как это лучше сделать? 

    6 декабря 2012 г. 20:01
  • Если вносились изменения в записи то вызвать метод Submit у контекста, потом выполнить запрос к базе еще раз, например по таймеру.

    6 декабря 2012 г. 20:12
  • Я видимо на своей волне и не объясняю как надо)

    Суть в том что приложение многопользовательское и за промежуток времени какие-то данные могли быть изменены другим пользователем. Надо не свои изменения применить (с этим всё ясно), а отразить чужие, т.е. связать старые объекты с новыми

    6 декабря 2012 г. 20:19
  • "Какой вариант использования DataContext будет правильнее - создать один на всё приложение или пересоздавать при необходимости?" - придерживайтесь принципа, чем меньше - тем лучше. Если это конечно возможно. На самом деле траты ресурсов по созданию объекта ничтожны. Проблема производительности кроется в запросах к БД. И тут, по мере возможностей, чем их меньше, тем лучше. Т.е. например лучше получить порцию данных за раз, чем скажем делать два запроса и открыть два соединения разом.

    "Так же не совсем понятно как правильно поддерживать актуальность информации из базы." - через определённые промежутки времени запрашивать их снова. Но вызывайте только данные тех сущностей которые нужны, а не все.

    • Помечено в качестве ответа andreas-hml 7 декабря 2012 г. 6:27
    7 декабря 2012 г. 5:45
    Модератор
  • Для обновления обьектов есть метод Refresh http://msdn.microsoft.com/ru-ru/library/bb534217.aspx

    посмотрите скорее всего это то что вам нужно

    • Помечено в качестве ответа andreas-hml 7 декабря 2012 г. 6:27
    7 декабря 2012 г. 5:47
  • Большое спасибо за ответы, буду пробовать
    7 декабря 2012 г. 6:28
  • Из опыта:

    1. Метод Refresh() работает заметно медленнее, чем создание нового контекста. Поэтому если данные выводятся где-то в одном месте интерфейса (DataGrid какой-нибудь), то лучше пересоздавать после изменений в источнике данных.

    2. Если же требуется в окне одновременно отображать одни и те же данные в разных вариантах (например древовидный список плюс расшифровка одного из его узлов в списке и плюс ещё какие-нибудь атрибуты в боковой панели), то вариант с одним контекстом данных (в виде поля уровня класса) удобнее, так как изменения во всех частях интерфейса синхронизируются автоматически.

    Кроме того, на заре развития L2SQL были рекомендации о полезности периодического пересоздания контекста из-за утечек памяти...

    • Помечено в качестве ответа andreas-hml 9 декабря 2012 г. 7:16
    7 декабря 2012 г. 16:45