Опубликован: 02.08.2013 | Уровень: для всех | Доступ: платный
Самостоятельная работа 11:

Локальные базы данных

< Самостоятельная работа 10 || Самостоятельная работа 11: 123 || Лекция 25 >

В Листинге 35.3 приведен код файла ToDoDataContext.cs

using System;
using System.ComponentModel;
using System.Data.Linq;
using System.Data.Linq.Mapping;

namespace LocalDatabaseSample.Model
{

    public class ToDoDataContext : DataContext
    {
        // Передача строки соединения базовому классу.
        public ToDoDataContext(string connectionString)
            : base(connectionString)
        { }

        // Указание таблицы для элементов.
        public Table<ToDoItem> Items;

        // Указание таблицы для категорий.
        public Table<ToDoCategory> Categories;
    }

    [Table]
    public class ToDoItem : INotifyPropertyChanged, INotifyPropertyChanging
    {

        // Определяет ID: закрытое поле, общедоступное поле, и столбец в таблице базы данных.
        private int _toDoItemId;

        [Column(IsPrimaryKey = true, IsDbGenerated = true, DbType = "INT NOT NULL Identity", 
CanBeNull = false, AutoSync = AutoSync.OnInsert)]
        public int ToDoItemId
        {
            get { return _toDoItemId; }
            set
            {
                if (_toDoItemId != value)
                {
                    NotifyPropertyChanging("ToDoItemId");
                    _toDoItemId = value;
                    NotifyPropertyChanged("ToDoItemId");
                }
            }
        }

        // Определяет имя элемента: закрытое поле, общедоступное поле, и столбец в таблице базы данных.
        private string _itemName;

        [Column]
        public string ItemName
        {
            get { return _itemName; }
            set
            {
                if (_itemName != value)
                {
                    NotifyPropertyChanging("ItemName");
                    _itemName = value;
                    NotifyPropertyChanged("ItemName");
                }
            }
        }

        // Определяет значение завершения: закрытое поле, общедоступное поле, 
и столбец в таблице базы данных.
        private bool _isComplete;

        [Column]
        public bool IsComplete
        {
            get { return _isComplete; }
            set
            {
                if (_isComplete != value)
                {
                    NotifyPropertyChanging("IsComplete");
                    _isComplete = value;
                    NotifyPropertyChanged("IsComplete");
                }
            }
        }

        // Столбец для определения производительности обновления.
        [Column(IsVersion = true)]
        private Binary _version;


        // Колонка Internal для связанного значения ID ToDoCategory
        [Column]
        internal int _categoryId;

        // Ссылка на сущность, для идентификации таблицы ToDoCategory "хранилища"
        private EntityRef<ToDoCategory> _category;

        // Ассоциация, для описания взаимосвязи между данным ключом и таблицей "хранилища"
        [Association(Storage = "_category", 
ThisKey = "_categoryId", OtherKey = "Id", IsForeignKey = true)]
        public ToDoCategory Category
        {
            get { return _category.Entity; }
            set
            {
                NotifyPropertyChanging("Category");
                _category.Entity = value;

                if (value != null)
                {
                    _categoryId = value.Id;
                }

                NotifyPropertyChanging("Category");
            }
        }


        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        // Используется для выдачи уведомлений о том, что свойство изменено
        private void NotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        #endregion

        #region INotifyPropertyChanging Members

        public event PropertyChangingEventHandler PropertyChanging;

        // Используется для выдачи уведомлений о том, что свойство может измениться
        private void NotifyPropertyChanging(string propertyName)
        {
            if (PropertyChanging != null)
            {
                PropertyChanging(this, new PropertyChangingEventArgs(propertyName));
            }
        }

        #endregion
    }


    [Table]
    public class ToDoCategory : INotifyPropertyChanged, INotifyPropertyChanging
    {

        // Определяет ID: закрытое поле, общедоступное поле, и столбец в таблице базы данных.
        private int _id;

        [Column(DbType = "INT NOT NULL IDENTITY", IsDbGenerated = true, IsPrimaryKey = true)]
        public int Id
        {
            get { return _id; }
            set
            {
                NotifyPropertyChanging("Id");
                _id = value;
                NotifyPropertyChanged("Id");
            }
        }

        // Определяет имя категории: закрытое поле, общедоступное поле, и столбец в таблице базы данных 
         private string _name;

        [Column]
        public string Name
        {
            get { return _name; }
            set
            {
                NotifyPropertyChanging("Name");
                _name = value;
                NotifyPropertyChanged("Name");
            }
        }

        // Столбец для определения производительности обновления.
        [Column(IsVersion = true)]
        private Binary _version;

        // Определяет набор сущностей для той стороны взаимодействия, 
которая имеет отношение к коллекции
        private EntitySet<ToDoItem> _todos;

        [Association(Storage = "_todos", OtherKey = "_categoryId", 
ThisKey = "Id")]
        public EntitySet<ToDoItem> ToDos
        {
            get { return this._todos; }
            set { this._todos.Assign(value); }
        }


        // Назначение обработчиков для операций добавления и удаления, соответственно
        public ToDoCategory()
        {
            _todos = new EntitySet<ToDoItem>(
                new Action<ToDoItem>(this.attach_ToDo),
                new Action<ToDoItem>(this.detach_ToDo)
                );
        }

        // Вызывается в ходе операции добавления
        private void attach_ToDo(ToDoItem toDo)
        {
            NotifyPropertyChanging("ToDoItem");
            toDo.Category = this;
        }

        // Вызывается в ходе операции удаления
        private void detach_ToDo(ToDoItem toDo)
        {
            NotifyPropertyChanging("ToDoItem");
            toDo.Category = null;
        }

        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        // Используется для выдачи уведомлений о том, что свойство изменено
        private void NotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        #endregion

        #region INotifyPropertyChanging Members

        public event PropertyChangingEventHandler PropertyChanging;

        // Используется для выдачи уведомлений о том, что свойство может измениться
        private void NotifyPropertyChanging(string propertyName)
        {
            if (PropertyChanging != null)
            {
                PropertyChanging(this, new PropertyChangingEventArgs(propertyName));
            }
        }

        #endregion
    }
}
Листинг 35.3. Файл ToDoDataContext.cs

Подробные сведения о разработке приложений, использующих базы данных, можно найти в материале "Локальная база данных для Windows Phone" (http://msdn.microsoft.com/en-us/library/windowsphone/develop/hh202860%28v=vs.105%29.aspx).

Для того, чтобы изучить пример разработки простой локальной базы данных для Windows Phone, без использовании шаблона проектирования MVVM, обратитесь к материалу "Как создать простое приложение для Windows Phone, работающее с базой данных" (http://msdn.microsoft.com/ru-RU/library/windowsphone/develop/hh202876%28v=vs.105%29.aspx).

Для того, чтобы найти дополнительные материалы по Linq to SQL, обратитесь к ресурсу "Linq to SQL" (http://msdn.microsoft.com/ru-ru/library/bb386976.aspx).

Выводы

Приложения для Windows Phone 8 могут хранить реляционные данные в локальных базах данных, с помощью механизмов Linq to SQL обеспечивается объектное представление баз данных в приложениях, что позволяет организовать удобную работу с ними.

Задание

Если приложение, созданием которого вы занимаетесь, подразумевает работу с данными, имеющими сложную структуру, рассмотрите возможность использования локальной базы данных для работы с ними. Кроме того, если приложение рассчитано на работу с локальной базой данных, это упростит, при необходимости, возможность перехода на использование облачной базы данных, работающей на платформе Windows Azure с использованием локальной базы данных в качестве локального кэша. Подготовьте отчёт по данному этапу работы, приведите в нём анализ данных, которые использует приложение и сделайте выводы о том, поможет ли использование базы данных улучшить структуру вашего приложения.

Для того, чтобы спроектировать базу данных для приложения вам могут понадобиться дополнительные знания, для того, чтобы их получить, вы можете обратиться к учебным курсам, посвященным базам данных на портале Intuit.ru (например, к курсу "Введение в реляционные базы данных", http://www.intuit.ru/studies/courses/74/74/info.

Дополнительные материалы

К данной лабораторной работе подготовлено видеоприложение.

< Самостоятельная работа 10 || Самостоятельная работа 11: 123 || Лекция 25 >
Вася Пупкин
Вася Пупкин
Россия, с. Оймякон
антон Антонкин
антон Антонкин
Россия

( ! ) Warning: include_once(./includes/unicode.entities.inc) [<a href='function.include-once'>function.include-once</a>]: failed to open stream: No such file or directory in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
15.9815103244424watchdog( )../bootstrap.inc:0
25.9818103246912module_invoke( )../bootstrap.inc:967
35.9818103248768call_user_func_array ( )../module.inc:462
45.9818103249104devel_watchdog( )../module.inc:462
55.9819103249952decode_entities( )../devel.module:382
65.9819103251872drupal_error_handler( )../devel.module:340
75.9820103255600watchdog( )../common.inc:663
85.9820103257712module_invoke( )../bootstrap.inc:967
95.9820103259592call_user_func_array ( )../module.inc:462
105.9820103259960devel_watchdog( )../module.inc:462
115.9820103260680decode_entities( )../devel.module:382

( ! ) Warning: include_once() [<a href='function.include'>function.include</a>]: Failed opening './includes/unicode.entities.inc' for inclusion (include_path='.:/usr/local/zend/var/libraries/Zend_Framework_1/default/library:/usr/local/zend/share/pear') in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
15.9815103244424watchdog( )../bootstrap.inc:0
25.9818103246912module_invoke( )../bootstrap.inc:967
35.9818103248768call_user_func_array ( )../module.inc:462
45.9818103249104devel_watchdog( )../module.inc:462
55.9819103249952decode_entities( )../devel.module:382
65.9819103251872drupal_error_handler( )../devel.module:340
75.9820103255600watchdog( )../common.inc:663
85.9820103257712module_invoke( )../bootstrap.inc:967
95.9820103259592call_user_func_array ( )../module.inc:462
105.9820103259960devel_watchdog( )../module.inc:462
115.9820103260680decode_entities( )../devel.module:382

( ! ) Warning: include_once(./includes/unicode.entities.inc) [<a href='function.include-once'>function.include-once</a>]: failed to open stream: No such file or directory in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
15.9815103244424watchdog( )../bootstrap.inc:0
25.9818103246912module_invoke( )../bootstrap.inc:967
35.9818103248768call_user_func_array ( )../module.inc:462
45.9818103249104devel_watchdog( )../module.inc:462
55.9819103249952decode_entities( )../devel.module:382
65.9826103252064drupal_error_handler( )../devel.module:340
75.9827103255872watchdog( )../common.inc:663
85.9827103257984module_invoke( )../bootstrap.inc:967
95.9827103259864call_user_func_array ( )../module.inc:462
105.9827103260232devel_watchdog( )../module.inc:462
115.9827103261032decode_entities( )../devel.module:382

( ! ) Warning: include_once() [<a href='function.include'>function.include</a>]: Failed opening './includes/unicode.entities.inc' for inclusion (include_path='.:/usr/local/zend/var/libraries/Zend_Framework_1/default/library:/usr/local/zend/share/pear') in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
15.9815103244424watchdog( )../bootstrap.inc:0
25.9818103246912module_invoke( )../bootstrap.inc:967
35.9818103248768call_user_func_array ( )../module.inc:462
45.9818103249104devel_watchdog( )../module.inc:462
55.9819103249952decode_entities( )../devel.module:382
65.9826103252064drupal_error_handler( )../devel.module:340
75.9827103255872watchdog( )../common.inc:663
85.9827103257984module_invoke( )../bootstrap.inc:967
95.9827103259864call_user_func_array ( )../module.inc:462
105.9827103260232devel_watchdog( )../module.inc:462
115.9827103261032decode_entities( )../devel.module:382

( ! ) Warning: include_once(./includes/unicode.entities.inc) [<a href='function.include-once'>function.include-once</a>]: failed to open stream: No such file or directory in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
15.9832103244968watchdog( )../bootstrap.inc:0
25.9832103247056module_invoke( )../bootstrap.inc:967
35.9832103248912call_user_func_array ( )../module.inc:462
45.9832103249248devel_watchdog( )../module.inc:462
55.9833103249952decode_entities( )../devel.module:382
65.9833103251872drupal_error_handler( )../devel.module:340
75.9833103255592watchdog( )../common.inc:663
85.9833103257704module_invoke( )../bootstrap.inc:967
95.9834103259584call_user_func_array ( )../module.inc:462
105.9834103259952devel_watchdog( )../module.inc:462
115.9834103260672decode_entities( )../devel.module:382

( ! ) Warning: include_once() [<a href='function.include'>function.include</a>]: Failed opening './includes/unicode.entities.inc' for inclusion (include_path='.:/usr/local/zend/var/libraries/Zend_Framework_1/default/library:/usr/local/zend/share/pear') in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
15.9832103244968watchdog( )../bootstrap.inc:0
25.9832103247056module_invoke( )../bootstrap.inc:967
35.9832103248912call_user_func_array ( )../module.inc:462
45.9832103249248devel_watchdog( )../module.inc:462
55.9833103249952decode_entities( )../devel.module:382
65.9833103251872drupal_error_handler( )../devel.module:340
75.9833103255592watchdog( )../common.inc:663
85.9833103257704module_invoke( )../bootstrap.inc:967
95.9834103259584call_user_func_array ( )../module.inc:462
105.9834103259952devel_watchdog( )../module.inc:462
115.9834103260672decode_entities( )../devel.module:382

( ! ) Warning: include_once(./includes/unicode.entities.inc) [<a href='function.include-once'>function.include-once</a>]: failed to open stream: No such file or directory in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
15.9832103244968watchdog( )../bootstrap.inc:0
25.9832103247056module_invoke( )../bootstrap.inc:967
35.9832103248912call_user_func_array ( )../module.inc:462
45.9832103249248devel_watchdog( )../module.inc:462
55.9833103249952decode_entities( )../devel.module:382
65.9840103252064drupal_error_handler( )../devel.module:340
75.9840103255864watchdog( )../common.inc:663
85.9840103257976module_invoke( )../bootstrap.inc:967
95.9840103259856call_user_func_array ( )../module.inc:462
105.9840103260224devel_watchdog( )../module.inc:462
115.9841103261024decode_entities( )../devel.module:382

( ! ) Warning: include_once() [<a href='function.include'>function.include</a>]: Failed opening './includes/unicode.entities.inc' for inclusion (include_path='.:/usr/local/zend/var/libraries/Zend_Framework_1/default/library:/usr/local/zend/share/pear') in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
15.9832103244968watchdog( )../bootstrap.inc:0
25.9832103247056module_invoke( )../bootstrap.inc:967
35.9832103248912call_user_func_array ( )../module.inc:462
45.9832103249248devel_watchdog( )../module.inc:462
55.9833103249952decode_entities( )../devel.module:382
65.9840103252064drupal_error_handler( )../devel.module:340
75.9840103255864watchdog( )../common.inc:663
85.9840103257976module_invoke( )../bootstrap.inc:967
95.9840103259856call_user_func_array ( )../module.inc:462
105.9840103260224devel_watchdog( )../module.inc:462
115.9841103261024decode_entities( )../devel.module:382