После работы мастера, у меня появилось два класса:
PhoneRefEntities - наследник от System.Data.Objects.ObjectContext
Stuff - наследник от System.Data.Objects.DataClasses.EntityObject
Для удобства немного расширил класс PhoneRefEntities, добавив в него статическое свойство Instance:
Copy Source | Copy HTML
- namespace PhoneRef.Data {
- partial class PhoneRefEntities {
- private static PhoneRefEntities _instance;
- private static readonly object SyncRoot = new object();
- public static PhoneRefEntities Instance {
- get {
- lock (SyncRoot) {
- if (_instance == null)
- _instance = new PhoneRefEntities();
- }
- return _instance;
- }
- }
- }
- }
Sql Server Compact не позволяет создавать связи внутри одной таблицы, поэтому свойство Parent тоже пришлось реализовать вручную:
Copy Source | Copy HTML
- private Stuff _parent;
- /// <summary>
- /// Руководитель
- /// </summary>
- public Stuff Parent {
- get {
- //SQL Server Compact не позволяет создавать связки на внутри одной таблицы
- // поэтому реализуем ее таким образом.
- return _parent ??
- (_parent = PhoneRefEntities.Instance.Stuff.FirstOrDefault(item => item.Id == ParentId));
- }
- set {
- if (value == null) ParentId = null;
- else ParentId = value.Id;
- }
- }
- partial void OnParentIdChanged() {
- _parent = null;
- }
Пользовательский интерфейс будет состоять из одной формы и иконки в панели уведомлений. Форма будет отображаться и скрываться при клике на иконку, и обеспечивать простейший поиск нужного сотрудника по фамилии, и отображение информации по выбранному сотруднику.
Исходный код примера можно скачать здесь. Вкратце после инициализации привязок, в конструкторе формы, пытаемся считать данные из локальной БД, вызвав метод RefreshDataSource()
Если локальная БД еще ни разу не синхронизировалась с сервером, то возникнет исключение EntityCommandExecutionException. В этом случае пытаемся провести синхронизацию, и еще раз перечитать данные.Copy Source | Copy HTML
- private void RefreshDataSource() {
- if (_entityes == null) _entityes = PhoneRefEntities.Instance;
- //Нужно для того чтобы возвратились данные из локальной БД, а не из кэша
- _entityes.Refresh(System.Data.Objects.RefreshMode.StoreWins, _entityes.Stuff);
- _bs.DataSource = (from stuff in _entityes.Stuff
- orderby stuff.LastName
- select stuff).ToList();
- }
Ну и в дальнейшем настраиваем таймер таким образом что бы каждую минуту вызывался метод SynchronizeAndRefresh(). Теперь если изменить данные на сервере, то в течение минуты (разумеется при наличии связи с сервером) эти изменения окажутся на клиенте.Copy Source | Copy HTML
- private void SynchronizeAndRefresh() {
- try {
- Data.Synchronization.SyncHelper.Synchronize();
- RefreshDataSource();
- } catch (Exception e) {
- Trace.WriteLine(e);
- }
Итого первая цель достигнута. А именно у нас есть работающее приложение способное работать в offline-режиме, и умеющее автоматически синхронизировать локальную БД с сервером, при наличии связи.


0 коммент.:
Отправить комментарий