Статьи

Windows Phone 8 Локальная база данных DataContext из существующей базы данных

Несмотря на то, что мои инструменты для этого доступны уже более 18 месяцев, я никогда не публиковал отдельную запись в блоге на эту тему. Этот пост намеревается исправить это.

Локальная база данных (база данных SQL Server Compact, доступ к которой осуществляется через LINQ to SQL) — это API доступа к данным, доступный в Windows Phone 7.5 и 8.

В документации Microsoft (приведенной здесь, в моем блоге , вместе со многими другими полезными ссылками на локальную базу данных Windows Phone) всегда описывается рабочий процесс Code First, что затрудняет повторное использование существующих усилий при создании схемы базы данных SQL Server Compact для Windows Mobile или настольного компьютера, а также затрудняет распространение базы данных, предварительно заполненной данными, вместе с вашим приложением. Мои инструменты, которые доступны с надстройкой SQL Server Toolbox для Visual Studio , а также доступны в более простой форме с новым автономным выпуском Toolbox для SQL Server Compact 3.5 (в настоящее время в альфа- версии ), включает оба сценария. Автономная версия полезна для пользователей VS Express и когда вы не хотите устанавливать Visual Studio на ПК (это отдельный файл .exe, поэтому его очень легко распространять).

В следующем пошаговом руководстве, используя Visual Studio 2012, я продемонстрирую, как использовать SQL Server Compact Toolbox, чтобы взять существующую базу данных SQL Server и использовать ее в качестве включенной базы данных Windows Phone в новом (или существующем) приложении Windows Phone 8. Для этого необходимо выполнить следующие действия:

— создать базу данных SQL Server Compact из базы данных сервера и добавить ее в проект Windows Phone;
— создать LINQ to SQL DataContext и выпущенные классы.
— Используйте базу данных из кода

Я предполагаю, что у вас установлена ​​Visual Studio 2012 Pro или выше с установленным Windows Phone 8 SDK.

Создайте базу данных SQL Server Compact

Я создал новое приложение Windows Phone Databound для этого образца и выбрал ОС Windows Phone 8.0 в качестве целевой ОС.

образ

Затем я использую панель инструментов для создания новой базы данных SQL Server Compact 3.5 в папке, в которой находится проект Phone (вы можете определить папку, используя пункт контекстного меню «Открыть папку в проводнике»).

образ

Затем нажмите «Создать», перейдите в папку проекта и введите «PostCodes.sdf», нажмите «ОК».

образ

Нажмите OK, и новая пустая база данных будет добавлена ​​в список баз данных на панели инструментов:

образ

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

образ

Создайте и сохраните сценарий базы данных с помощью пункта меню «Панель инструментов» выше, а затем откройте редактор SQL для файла базы данных PostCodes.sdf:

образ

Используйте кнопку «Открыть» в редакторе, чтобы загрузить скрипт, и нажмите кнопку «Выполнить», чтобы запустить скрипт.

образ

Теперь база данных содержит таблицу PostCode (скрипт доступен здесь ), в которой есть все датские почтовые индексы.

Последний шаг — добавление файла базы данных в проект Phone. В обозревателе решений выберите «Показать все файлы» и включите PostCodes.sdf. В этом примере сценария мы хотели бы, чтобы база данных стала доступной для записи на телефоне, поэтому включите ее в качестве «встроенного ресурса» — ее также можно включить в качестве контента, если это просто база данных только для чтения, подробнее читайте здесь.

образ

Создайте LINQ to SQL DataContext

Чтобы создать DataContext на основе базы данных, щелкните его правой кнопкой мыши на панели инструментов и выберите «Добавить Windows Phone DataContext в текущий проект».

образ

образ

Давайте пройдемся по различным параметрам в этом диалоге:

Имя контекста: имя сгенерированного класса DataContext

Пространство имен: позволяет указать другое пространство имен для сгенерированного кода.

Язык: вы можете генерировать код C # или VB.

Pluralize: если отмечено, переименует таблицы (Person => People) и т. Д.

Создайте файл для каждой таблицы: обычно создается только один файл

Расширенные опции:

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

Добавить столбец версии строки ко всем таблицам: отметив это, вы убедитесь, что во всех таблицах есть столбец версии строки (ранее отметка времени), что повышает производительность при выполнении UPDATE и DELETE (см. Мои публикации в блоге здесь и здесь )

Включить ConnectionStringBuilder: добавит в проект класс LocalDatabaseConnectionStringBuilder, чтобы помочь в построении строк подключения строго типизированным способом.

Для этого примера проекта просто нажмите OK, и файл PostCodesContext.cs будет добавлен в проект, и все готово.

образ

Используйте базу данных из кода

Наконец, чтобы продемонстрировать, что мы можем включать данные в приложение, измените DataTemplate в MainPage.xaml следующим образом:

<DataTemplate>
  <StackPanel Margin="0,0,0,17">
      <TextBlock Text="{Binding Zip}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/>
      <TextBlock Text="{Binding City}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/>
  </StackPanel>
</DataTemplate>

Замените обработчик события OnNavigatedTo в MainPage.xaml.cs следующим кодом:

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            using (PostCodesContext ctx = new PostCodesContext(PostCodesContext.ConnectionString))
            {
                ctx.CreateIfNotExists();
                ctx.LogDebug = true;
                MainLongListSelector.ItemsSource = ctx.PostCode.ToList();                
            }
        }

Этот код инициализирует новый экземпляр PostCodesContext (включенный в «using», так как он одноразовый). Метод CreateIfNotExists извлекает встроенный ресурс PostCodes.sdf из проекта и копирует его в изолированное хранилище (см. Код). Если для LogDebug задано значение true, при отладке все операторы SQL отображаются в виде текста в окне отладки:

ВЫБЕРИТЕ [t0]. [Id], [t0]. [Zip], [t0]. [Город], [t0]. [Улица], [t0]. [Компания], [t0]. [IsProvince], [ t0]. [rowguid] AS [Rowguid], [t0]. [ts] AS [Ts]
ОТ [PostCode] AS [t0]

И, наконец, вызов ToList () выполнит SELECT и вернет список объектов PostCode, который связан со свойством ItemsSource LongListSelector.

Результат:

ПК

Резюме

Давайте закончим с кратким изложением преимуществ этого подхода:
— Используйте настольные инструменты базы данных для заполнения данных и проектирования схемы
— Экономит время, делая отображение 1: 1 между таблицами базы данных и классами
DataContext — Класс DataContext и классы сущностей являются частичными и могут быть расширены
— Сгенерированный DataContext содержит определения индекса (который SqlMetal не поддерживает, поскольку это расширение для Windows Phone).
— Сгенерированный DataContext содержит метод CreateIfNotExists, который дополнительно извлекает включенную базу данных (предварительно заполненную данными) в изолированное хранилище.
— Сгенерированный DataContext включает в себя Свойство LogDebug, позволяющее увидеть все операторы SQL, сгенерированные на устройстве, в окне отладки.
— При желании можно разделить сгенерированные классы контекста данных на несколько файлов.
— При желании можно добавить таблицу версий, если вы включили таблицу в свое приложение и хотите разрешить использование функции средства обновления схемы.
— При желании добавьте столбцы версии строки для повышения производительности UPDATE и DELETE.
— При желании добавьте класс ConnectionStringBuilder для создания допустимой строки подключения строго типизированным способом, используя расширенные параметры строки подключения (см. Некоторые из моих сообщений в блоге Phone для кандидатов).