Развертывание веб-приложения ASP.NET с помощью SQL Server Compact с помощью Visual Studio или Visual Web Developer: Развертывание баз данных SQL Server Compact — 2 из 12

Том Дайкстра

Скачать начальный проект

В этой серии учебников показано, как развернуть (опубликовать) проект веб-приложения ASP.NET, включающий базу данных SQL Server Compact, с помощью версии-кандидата Visual Studio 2012 или Visual Studio Express 2012 RC for Web. Вы также можете использовать Visual Studio 2010 при установке обновления веб-публикации. Общие сведения о серии см. в первом руководстве этой серии.

Руководство по функциям развертывания, появившиеся после выпуска версии-кандидата Visual Studio 2012, развертывание SQL Server выпусков, отличных от SQL Server Compact, и развертывание в Служба приложений Azure веб-приложения см. в разделе ASP.NET веб-развертывание с помощью Visual Studio.

Общие сведения

В этом руководстве показано, как настроить для развертывания две базы данных SQL Server Compact и ядро СУБД.

Для доступа к базе данных приложению Университета Contoso требуется следующее программное обеспечение, которое должно быть развернуто вместе с приложением, так как оно не входит в платформа .NET Framework:

Также необходимо развернуть структуру базы данных и некоторые (не все) данные в двух базах данных приложения. Как правило, при разработке приложения тестовые данные внося в базу данных, которую не хотите развертывать на активном сайте. Однако можно также ввести некоторые рабочие данные, которые требуется развернуть. В этом руководстве вы настроите проект Университета Contoso таким образом, чтобы при развертывании включались необходимое программное обеспечение и правильные данные.

Напоминание. Если при работе с руководством появляется сообщение об ошибке или что-то не работает, обязательно проверка страницу устранения неполадок.

SQL Server Compact и SQL Server Express

В примере приложения используется SQL Server Compact 4.0. Это ядро СУБД является относительно новым вариантом для веб-сайтов; более ранние версии SQL Server Compact не работают в среде веб-размещения. SQL Server Compact предлагает несколько преимуществ по сравнению с более распространенным сценарием разработки с использованием SQL Server Express и развертывания в полной SQL Server. В зависимости от выбранного поставщика услуг размещения развертывание SQL Server Compact может оказаться дешевле, так как некоторые поставщики взимают дополнительную плату за поддержку полной базы данных SQL Server. Плата за SQL Server Compact не взимается, так как вы можете развернуть само ядро СУБД в составе веб-приложения.

Однако следует также помнить о его ограничениях. SQL Server Compact не поддерживает хранимые процедуры, триггеры, представления или репликацию. (Полный список функций SQL Server, которые не поддерживаются SQL Server Compact, см. в разделе Различия между SQL Server Compact и SQL Server.) Кроме того, некоторые средства, которые можно использовать для управления схемами и данными в SQL Server Express и SQL Server базах данных, не работают с SQL Server Compact. Например, нельзя использовать SQL Server Management Studio или SQL Server Data Tools в Visual Studio с SQL Server Compact базами данных. У вас есть другие варианты работы с SQL Server Compact базами данных:

  • Серверные Обозреватель можно использовать в Visual Studio, которая предоставляет ограниченные функции управления базами данных для SQL Server Compact.
  • Вы можете использовать функцию управления базами данных WebMatrix, которая имеет больше возможностей, чем серверные Обозреватель.
  • Вы можете использовать относительно полнофункциональную стороннюю или открытый код инструменты, такие как SQL Server Compact Панель элементов и служебная программа sql Compact для работы с данными и схемами.
  • Вы можете создавать и запускать собственные скрипты DDL (язык определения данных) для управления схемой базы данных.

Вы можете начать с SQL Server Compact, а затем обновить позже по мере развития ваших потребностей. В последующих руководствах этой серии показано, как выполнить миграцию с SQL Server Compact на SQL Server Express и на SQL Server. Однако если вы создаете новое приложение и ожидаете, что в ближайшем будущем потребуется SQL Server, лучше начать с SQL Server или SQL Server Express.

Настройка ядра СУБД SQL Server Compact для развертывания

Программное обеспечение, необходимое для доступа к данным в приложении Contoso University, было добавлено путем установки следующих пакетов NuGet:

Ссылки указывают на текущие версии этих пакетов, которые могут быть более новыми, чем те, которые установлены в начальном проекте, скачанном для этого руководства. Для развертывания в поставщике услуг размещения убедитесь, что используется Entity Framework 5.0 или более поздней версии. Более ранние версии Code First Migrations требуют полного доверия, и во многих поставщиках услуг размещения ваше приложение будет работать в среде среднего доверия. Дополнительные сведения о среднем доверии см. в учебнике Развертывание в IIS в качестве тестовой среды .

Установка пакета NuGet обычно отвечает за все, что необходимо для развертывания этого программного обеспечения с приложением. В некоторых случаях это включает в себя такие задачи, как изменение файла Web.config и добавление скриптов PowerShell, которые выполняются при создании решения. Если вы хотите добавить поддержку для любой из этих функций (например, SQL Server Compact и Entity Framework) без использования NuGet, убедитесь, что вы знаете, что делает установка пакета NuGet, чтобы выполнить ту же работу вручную.

Существует одно исключение, в котором NuGet не выполняет все действия, необходимые для успешного развертывания. Пакет NuGet SqlServerCompact добавляет в проект скрипт после сборки, который копирует собственные сборки во вложенные папки x86 и amd64 в папке bin проекта, но скрипт не включает эти папки в проект. В результате веб-развертывание не будет копировать их на целевой веб-сайт, если вы не включите их в проект вручную. (Это поведение является результатом конфигурации развертывания по умолчанию. Другой вариант, который вы не будете использовать в этих руководствах, заключается в изменении параметра, который управляет этим поведением. Вы можете изменить параметр Только файлы, необходимые для запуска приложения в разделе Элементы для развертывания на вкладке Пакет или публикация веб-страницы окна Свойства проекта . Изменять этот параметр обычно не рекомендуется, так как это может привести к развертыванию в рабочей среде гораздо большего количества файлов, чем требуется. Дополнительные сведения об альтернативных вариантах см. в руководстве По настройке свойств проекта .)

Выполните сборку проекта, а затем в Обозреватель решений щелкните Показать все файлы, если вы еще этого не сделали. Также может потребоваться нажать кнопку Обновить.

Solution_Explorer_Show_All_Files

Разверните папку bin , чтобы просмотреть папки amd64 и x86 , а затем выберите эти папки, щелкните правой кнопкой мыши и выберите Включить в проект.

amd64_and_x86_in_Solution_Explorer.png

Значки папок изменяются, чтобы показать, что папка включена в проект.

Solution_Explorer_amd64_included.png

Настройка Code First Migrations для развертывания базы данных приложений

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

Чтобы имитировать этот распространенный сценарий, вы настроите метод Code First Migrations Seed, который вставляет в базу данных только те данные, которые вы хотите использовать в рабочей среде. Этот метод Seed не будет вставлять тестовые данные, так как он будет выполняться в рабочей среде после того, как Code First создаст базу данных в рабочей среде.

В более ранних версиях Code First до выпуска миграции методы Seed часто вставляли тестовые данные, так как при каждом изменении модели во время разработки базу данных приходилось полностью удалять и повторно создавать с нуля. При использовании Code First Migrations тестовые данные сохраняются после изменений базы данных, поэтому включать тестовые данные в метод Seed не требуется. Скачанный проект использует метод pre-Migrations для включения всех данных в метод Seed класса инициализатора. В этом руководстве вы отключите класс инициализатора и включите миграции. Затем вы обновите метод Seed в классе конфигурации Migrations, чтобы он вставлял только данные, которые нужно вставить в рабочую среду.

На следующей схеме показана схема базы данных приложения.

School_database_diagram

В этих руководствах предполагается, что Student таблицы и Enrollment должны быть пустыми при первом развертывании сайта. Другие таблицы содержат данные, которые необходимо предварительно загрузить при запуске приложения.

Так как вы будете использовать Code First Migrations, вам больше не нужно использовать инициализатор DropCreateDatabaseIfModelChanges Code First. Код для этого инициализатора находится в файле SchoolInitializer.cs в проекте ContosoUniversity.DAL. Параметр в элементе appSettings файла Web.config приводит к тому, что этот инициализатор запускается всякий раз, когда приложение пытается получить доступ к базе данных в первый раз:

<appSettings>
  <add key="Environment" value="Dev" />
  <add key="DatabaseInitializerForType ContosoUniversity.DAL.SchoolContext, ContosoUniversity.DAL" value="ContosoUniversity.DAL.SchoolInitializer, ContosoUniversity.DAL" />
</appSettings>

Откройте файл Web.config приложения и удалите элемент, указывающий класс инициализатора Code First, из элемента appSettings. Элемент appSettings теперь выглядит следующим образом:

<appSettings>
  <add key="Environment" value="Dev" />
</appSettings>

Примечание

Еще один способ указать класс инициализатора — вызвать Database.SetInitializer метод в Application_Start файле Global.asax . Если вы включаете миграцию в проекте, который использует этот метод для указания инициализатора, удалите эту строку кода.

Затем включите Code First Migrations.

Первый шаг — убедиться, что проект ContosoUniversity задан в качестве запускаемого проекта. В Обозреватель решений щелкните правой кнопкой мыши проект ContosoUniversity и выберите на выбор в качестве запускаемого проекта. Code First Migrations найдите строку подключения к базе данных в запускаемом проекте.

В меню Сервис выберите пункт Диспетчер пакетов NuGet , а затем — Консоль диспетчера пакетов.

Selecting_Package_Manager_Console

В верхней части окна Консоль диспетчера пакетов выберите ContosoUniversity.DAL в качестве проекта по умолчанию, а затем введите PM> "enable-migrations".

enable-migrations_command

Эта команда создает файл Configuration.cs в новой папке Migrations в проекте ContosoUniversity.DAL.

Migrations_folder_in_Solution_Explorer

Вы выбрали проект DAL, так как команда enable-migrations должна выполняться в проекте, содержающем класс контекста Code First. Когда этот класс находится в проекте библиотеки классов, Code First Migrations ищет строку подключения к базе данных в запускаемом проекте для решения. В решении ContosoUniversity веб-проект был задан в качестве запускаемого проекта. (Если вы не хотите назначать проект со строкой подключения в качестве запускаемого проекта в Visual Studio, можно указать запускаемый проект в команде PowerShell. Чтобы просмотреть синтаксис команды enable-migrations, введите команду get-help enable-migrations.)

Откройте файл Configuration.cs и замените комментарии в методе Seed следующим кодом:

var instructors = new List<Instructor>
{   
    new Instructor { FirstMidName = "Kim",     LastName = "Abercrombie", HireDate = DateTime.Parse("1995-03-11"), OfficeAssignment = new OfficeAssignment { Location = "Smith 17" } },
    new Instructor { FirstMidName = "Fadi",    LastName = "Fakhouri",    HireDate = DateTime.Parse("2002-07-06"), OfficeAssignment = new OfficeAssignment { Location = "Gowan 27" } },
    new Instructor { FirstMidName = "Roger",   LastName = "Harui",       HireDate = DateTime.Parse("1998-07-01"), OfficeAssignment = new OfficeAssignment { Location = "Thompson 304" } },
    new Instructor { FirstMidName = "Candace", LastName = "Kapoor",      HireDate = DateTime.Parse("2001-01-15") },
    new Instructor { FirstMidName = "Roger",   LastName = "Zheng",       HireDate = DateTime.Parse("2004-02-12") }
};
instructors.ForEach(s => context.Instructors.AddOrUpdate(i => i.LastName, s));
context.SaveChanges();

var departments = new List<Department>
{
    new Department { Name = "English",     Budget = 350000, StartDate = DateTime.Parse("2007-09-01"), PersonID = 1 },
    new Department { Name = "Mathematics", Budget = 100000, StartDate = DateTime.Parse("2007-09-01"), PersonID = 2 },
    new Department { Name = "Engineering", Budget = 350000, StartDate = DateTime.Parse("2007-09-01"), PersonID = 3 },
    new Department { Name = "Economics",   Budget = 100000, StartDate = DateTime.Parse("2007-09-01"), PersonID = 4 }
};
departments.ForEach(s => context.Departments.AddOrUpdate(d => d.Name, s));
context.SaveChanges();

var courses = new List<Course>
{
    new Course { CourseID = 1050, Title = "Chemistry",      Credits = 3, DepartmentID = 3, Instructors = new List<Instructor>() },
    new Course { CourseID = 4022, Title = "Microeconomics", Credits = 3, DepartmentID = 4, Instructors = new List<Instructor>() },
    new Course { CourseID = 4041, Title = "Macroeconomics", Credits = 3, DepartmentID = 4, Instructors = new List<Instructor>() },
    new Course { CourseID = 1045, Title = "Calculus",       Credits = 4, DepartmentID = 2, Instructors = new List<Instructor>() },
    new Course { CourseID = 3141, Title = "Trigonometry",   Credits = 4, DepartmentID = 2, Instructors = new List<Instructor>() },
    new Course { CourseID = 2021, Title = "Composition",    Credits = 3, DepartmentID = 1, Instructors = new List<Instructor>() },
    new Course { CourseID = 2042, Title = "Literature",     Credits = 4, DepartmentID = 1, Instructors = new List<Instructor>() }
};
courses.ForEach(s => context.Courses.AddOrUpdate(s));
context.SaveChanges();

courses[0].Instructors.Add(instructors[0]);
courses[0].Instructors.Add(instructors[1]);
courses[1].Instructors.Add(instructors[2]);
courses[2].Instructors.Add(instructors[2]);
courses[3].Instructors.Add(instructors[3]);
courses[4].Instructors.Add(instructors[3]);
courses[5].Instructors.Add(instructors[3]);
courses[6].Instructors.Add(instructors[3]);
context.SaveChanges();

Ссылки на List имеют красные волнистые линии под ними, так как у using вас еще нет оператора для его пространства имен. Щелкните правой кнопкой мыши один из экземпляров List и выберите команду Разрешить, а затем выберите команду с помощью System.Collections.Generic.

Разрешение с помощью инструкции using

Этот пункт меню добавляет следующий код в using операторы в верхней части файла.

using System.Collections.Generic;

Примечание

Добавление кода в Seed метод — это один из многих способов вставки фиксированных данных в базу данных. Альтернативой является добавление кода в Up методы и Down каждого класса миграции. Методы Up и Down содержат код, реализующий изменения базы данных. Примеры см. в руководстве Развертывание обновления базы данных .

Можно также написать код, который выполняет инструкции SQL с помощью Sql метода . Например, если вы добавляли столбец Бюджет в таблицу Department и хотите инициализировать все бюджеты отдела в размере 1000,00 долл. США в рамках миграции, можно добавить следующую строку кода Up в метод для этой миграции:

Sql("UPDATE Department SET Budget = 1000");

В этом примере, показанном в этом руководствеAddOrUpdate, используется метод в Seed методе класса Code First MigrationsConfiguration. Code First Migrations вызывает Seed метод после каждой миграции, и этот метод обновляет уже вставленные строки или вставляет их, если они еще не существуют. Метод AddOrUpdate может оказаться не лучшим вариантом для вашего сценария. Дополнительные сведения см. в статье Использование метода AddOrUpdate для EF 4.3 в блоге Джули Лерман.

Нажмите клавиши CTRL+SHIFT+B, чтобы выполнить сборку проекта.

Следующим шагом является создание DbMigration класса для начальной миграции. Вы хотите, чтобы эта миграция создавала новую базу данных, поэтому необходимо удалить уже существующую базу данных. SQL Server Compact базы данных содержатся в SDF-файлах в папке App_Data. В Обозреватель решений разверните App_Data в проекте ContosoUniversity, чтобы просмотреть две базы данных SQL Server Compact, представленные SDF-файлами.

Щелкните правой кнопкой мыши файл School.sdf и выберите команду Удалить.

sdf_files_in_Solution_Explorer

В окне Консоль диспетчера пакетов введите команду add-migration Initial, чтобы создать начальную миграцию, и назовите ее Initial.

надстройка migration_command

Code First Migrations создает другой файл класса в папке Migrations, и этот класс содержит код, создающий схему базы данных.

В консоли диспетчера пакетов введите команду update-database, чтобы создать базу данных и запустить метод Seed .

обновление database_command

(Если появляется ошибка, указывающая, что таблица уже существует и ее невозможно создать, вероятно, это связано с тем, что вы запустили приложение после удаления базы данных и перед выполнением update-database. В этом случае удалите файл School.sdf еще раз и повторите update-database команду.)

Запустите приложение. Теперь страница "Учащиеся" пуста, но страница "Преподаватели" содержит преподавателей. Это то, что вы получите в рабочей среде после развертывания приложения.

Empty_Students_page

Instructors_page_after_initial_migration

Теперь проект готов к развертыванию базы данных School .

Создание базы данных членства для развертывания

Приложение Contoso University использует систему членства ASP.NET и проверку подлинности с помощью форм для проверки подлинности и авторизации пользователей. Одна из его страниц доступна только администраторам. Чтобы просмотреть эту страницу, запустите приложение и выберите Обновить кредиты во всплывающем меню в разделе Курсы. Приложение отображает страницу Входа , так как только администраторы имеют право использовать страницу "Обновить кредиты ".

Log_in_page

Войдите в систему с правами администратора, используя пароль Pas$w0rd (обратите внимание на нулевую цифру вместо буквы "o" в "w0rd"). После входа отобразится страница "Кредиты на обновление ".

Update_Credits_page

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

Примечание

В базе данных членства хранится хэш паролей учетных записей. Чтобы развернуть учетные записи с одного компьютера на другом, необходимо убедиться, что подпрограммы хэширования не создают на конечном сервере другие хэши, чем на исходном компьютере. Они будут создавать одни и те же хэши при использовании универсальные поставщики ASP.NET, если вы не измените алгоритм по умолчанию. Алгоритм по умолчанию — HMACSHA256 и указывается в атрибуте проверки элемента machineKey в файле Web.config.

База данных членства не поддерживается Code First Migrations, и нет автоматического инициализатора, который заполняет базу данных тестовыми учетными записями (как и для базы данных School). Таким образом, чтобы тестовые данные были доступны, необходимо создать копию тестовой базы данных перед созданием новой.

В Обозреватель решений переименуйте файл aspnet.sdf в папке App_Data на aspnet-Dev.sdf. (Не создавайте копию, просто переименуйте ее— вы создадите новую базу данных через мгновение.)

В Обозреватель решений убедитесь, что выбран веб-проект (ContosoUniversity, а не ContosoUniversity.DAL). Затем в меню Проект выберите ASP.NET Конфигурация , чтобы запустить средство администрирования веб-сайта (WAT).

Перейдите на вкладку Безопасность.

WAT_Security_tab

Щелкните Создать или управление ролями и добавьте роль администратора .

WAT_Create_New_Role

Вернитесь на вкладку Безопасность , щелкните Создать пользователя и добавьте пользователя admin в качестве администратора. Прежде чем нажать кнопку Создать пользователя на странице Создание пользователя, убедитесь, что выбрано поле Администратор проверка. В этом руководстве используется пароль Pas$w0rd, и вы можете ввести любой адрес электронной почты.

WAT_Create_User

Закройте браузер. В Обозреватель решений нажмите кнопку обновления, чтобы просмотреть новый файл aspnet.sdf.

New_aspnet.sdf_in_Solution_Explorer

Щелкните правой кнопкой мыши aspnet.sdf и выберите Включить в проект.

Отличие баз данных разработки от рабочих баз данных

В этом разделе вы переименуете базы данных, чтобы версии разработки — School-Dev.sdf и aspnet-Dev.sdf, а рабочие — School-Prod.sdf и aspnet-Prod.sdf. Это необязательно, но это поможет вам не получить тестовые и рабочие версии баз данных.

В Обозреватель решений щелкните Обновить и разверните папку App_Data, чтобы просмотреть созданную ранее базу данных School. Щелкните ее правой кнопкой мыши и выберите Включить в проект.

Including_School.sdf_in_project

Переименуйте aspnet.sdf в aspnet-Prod.sdf.

Переименуйте School.sdf в School-Dev.sdf.

При запуске приложения в Visual Studio вы не хотите использовать версии -Prod файлов базы данных, а версии -Dev . Поэтому необходимо изменить строки подключения в файле Web.config таким образом, чтобы они указывали на версии баз данных -Dev . (Вы еще не создали файл School-Prod.sdf, но это нормально, так как Code First создаст эту базу данных в рабочей среде при первом запуске приложения.)

Откройте файл Web.config приложения и найдите строки подключения:

<configuration>
  <!-- Settings -->
  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=|DataDirectory|aspnet.sdf" providerName="System.Data.SqlServerCe.4.0" />
    <add name="SchoolContext" connectionString="Data Source=|DataDirectory|School.sdf" providerName="System.Data.SqlServerCe.4.0" />
  </connectionStrings>
  <!-- Settings -->
</configuration>

Измените "aspnet.sdf" на "aspnet-Dev.sdf", а "School.sdf" на "School-Dev.sdf":

<configuration>
  <!-- Settings -->
  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=|DataDirectory|aspnet-Dev.sdf" providerName="System.Data.SqlServerCe.4.0" />
    <add name="SchoolContext" connectionString="Data Source=|DataDirectory|School-Dev.sdf" providerName="System.Data.SqlServerCe.4.0" />
  </connectionStrings>
  <!-- Settings -->
</configuration>

Теперь SQL Server Compact ядро СУБД и обе базы данных готовы к развертыванию. В следующем руководстве вы настроите автоматическое преобразование файловWeb.config для параметров, которые должны отличаться в средах разработки, тестирования и рабочей среды. (Среди параметров, которые необходимо изменить, — строки подключения, но вы настроите эти изменения позже при создании профиля публикации.)

Дополнительные сведения

Дополнительные сведения о NuGet см. в статье Управление библиотеками проектов с помощью NuGet и Документации по NuGet. Если вы не хотите использовать NuGet, необходимо научиться анализировать пакет NuGet, чтобы определить, что он делает при установке. (Например, можно настроить Web.config преобразования, скрипты PowerShell для выполнения во время сборки и т. д.) Дополнительные сведения о работе NuGet см. в статье Создание и публикация пакета , а также преобразование файла конфигурации и исходного кода.