ASP.NET веб-развертывание с помощью Visual Studio: подготовка к развертыванию базы данных

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

В этой серии руководств показано, как развернуть (опубликовать) веб-приложение ASP.NET для Служба приложений Azure веб-приложения или стороннего поставщика услуг размещения с помощью Visual Studio 2012 или Visual Studio 2010. Сведения о серии см. в первом руководстве этой серии.

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

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

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

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

SQL Server Express LocalDB

В примере приложения используется SQL Server Express LocalDB. SQL Server Express является бесплатным выпуском SQL Server. Он обычно используется во время разработки, так как он основан на том же ядре СУБД, что и полные версии SQL Server. Вы можете протестировать с помощью SQL Server Express и убедиться, что приложение будет вести себя так же в рабочей среде, за некоторыми исключениями для функций, которые различаются в разных выпусках SQL Server.

LocalDB — это специальный режим выполнения SQL Server Express, который позволяет работать с базами данных в виде MDF-файлов. Как правило, файлы базы данных LocalDB хранятся в папке App_Data веб-проекта. Функция пользовательского экземпляра в SQL Server Express также позволяет работать с MDF-файлами, но эта функция экземпляра пользователя не рекомендуется использовать, поэтому для работы с MDF-файлами рекомендуется использовать LocalDB.

Как правило, SQL Server Express не используется для рабочих веб-приложений. LocalDB, в частности, не рекомендуется использовать в рабочей среде с веб-приложением, так как она не предназначена для работы с IIS.

В Visual Studio 2012 LocalDB устанавливается по умолчанию вместе с Visual Studio. В Visual Studio 2010 и более ранних версиях SQL Server Express (без LocalDB) устанавливается по умолчанию вместе с Visual Studio. Именно поэтому вы установили его в качестве одного из предварительных требований в первом руководстве этой серии.

Дополнительные сведения о выпусках SQL Server, включая LocalDB, см. в следующих ресурсах Работа с базами данных SQL Server.

Entity Framework и универсальные поставщики

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

Так как это программное обеспечение входит в пакеты NuGet, проект уже настроен таким образом, чтобы необходимые сборки развертывались вместе с проектом. (Ссылки указывают на текущие версии этих пакетов, которые могут быть более новыми, чем установленные в начальном проекте, скачанном для этого руководства.)

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

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

База данных приложений Университета Contoso управляется Code First, и вы развернете ее с помощью Code First Migrations. Общие сведения о развертывании базы данных с помощью Code First Migrations см. в первом руководстве этой серии.

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

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

В более ранних версиях Code First до выпуска Seed миграции методы также вставляли тестовые данные, так как при каждом изменении модели во время разработки базу данных приходилось полностью удалять и повторно создавать с нуля. При использовании Code First Migrations тестовые данные сохраняются после изменений базы данных, поэтому включать тестовые данные в Seed метод не требуется. Скачанный проект использует метод включения всех данных в 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 и удалите или закомментируйте add элемент, указывающий класс инициализатора Code First. Теперь appSettings элемент выглядит следующим образом:

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

Примечание

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

Примечание

Если вы используете Visual Studio 2013, добавьте следующие шаги между шагами 2 и 3: (a) В PMC введите "update-package entityframework -version 6.1.1", чтобы получить текущую версию EF. Затем (б) выполните сборку проекта, чтобы получить список ошибок сборки и исправить их. Удалите операторы using для пространств имен, которые больше не существуют, щелкните правой кнопкой мыши и выберите команду Разрешить, чтобы добавить инструкции using там, где они необходимы, и измените вхождения System.Data.EntityState на System.Data.EntityState.

Включение Code First Migrations

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

  2. В меню Сервис выберитеКонсоль диспетчера>пакетов NuGet.

    Selecting_Package_Manager_Console

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

    Команда enable-migrations

    (Если возникает ошибка с сообщением о том, что команда enable-migrations не распознана, введите команду update-package EntityFramework -Reinstall и повторите попытку.)

    Эта команда создает папку Migrations в проекте ContosoUniversity.DAL и помещает в нее два файла: файл Configuration.cs , который можно использовать для настройки migrations, и файл InitialCreate.cs для первой миграции, создающей базу данных.

    Папка

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

    Команда enable-migrations автоматически создает первую миграцию, так как база данных уже существует. Кроме того, миграция создает базу данных. Для этого используйте Обозреватель сервера или SQL Server обозреватель объектов, чтобы удалить базу данных ContosoUniversity перед включением миграции. После включения миграции создайте первую миграцию вручную, введя команду add-migration InitialCreate. Затем можно создать базу данных, введя команду "update-database".

Настройка метода Seed

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

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

  1. Откройте файл 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 },
        new Course { CourseID = 4022, Title = "Microeconomics", Credits = 3, DepartmentID = 4 },
        new Course { CourseID = 4041, Title = "Macroeconomics", Credits = 3, DepartmentID = 4 },
        new Course { CourseID = 1045, Title = "Calculus",       Credits = 4, DepartmentID = 2 },
        new Course { CourseID = 3141, Title = "Trigonometry",   Credits = 4, DepartmentID = 2 },
        new Course { CourseID = 2021, Title = "Composition",    Credits = 3, DepartmentID = 1 },
        new Course { CourseID = 2042, Title = "Literature",     Credits = 4, DepartmentID = 1 }
    };
    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();
    
  2. Ссылки на List имеют красные волнистые линии под ними, так как у using вас еще нет оператора для его пространства имен. Щелкните правой кнопкой мыши один из экземпляров List и выберите команду Разрешить, а затем выберите команду с помощью System.Collections.Generic.

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

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

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

Теперь проект готов к развертыванию базы данных ContosoUniversity . После развертывания приложения при первом запуске и переходе на страницу, которая обращается к базе данных, Code First создаст базу данных и запустит этот Seed метод.

Примечание

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

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

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

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

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

Запустите приложение и щелкните Курсы, а затем — Обновить кредиты.

Щелкните Обновить кредиты.

Откроется страница Вход, так как для страницы "Обновить кредиты " требуются права администратора.

Введите admin в качестве имени пользователя и devpwd в качестве пароля и нажмите кнопку Войти.

Страница входа

Откроется страница Обновление кредитов .

Страница

Сведения о пользователях и роли содержатся в базе данных aspnet-ContosoUniversity , указанной в строке подключения DefaultConnection в файлеWeb.config .

Эта база данных не управляется Entity Framework Code First, поэтому вы не можете использовать миграции для ее развертывания. Вы будете использовать поставщик dbDacFx для развертывания схемы базы данных и настроите профиль публикации для выполнения скрипта, который будет вставлять начальные данные в таблицы базы данных.

Примечание

В Visual Studio 2013 появилась новая система членства ASP.NET (теперь называется ASP.NET Identity). Новая система позволяет хранить как таблицы приложений, так и таблицы членства в одной базе данных, а также использовать Code First Migrations для развертывания обеих баз данных. В примере приложения используется более ранняя система членства ASP.NET, которую нельзя развернуть с помощью Code First Migrations. Процедуры развертывания этой базы данных членства применяются также к любому другому сценарию, в котором приложению необходимо развернуть базу данных SQL Server, созданную не с помощью Entity Framework Code First.

Здесь также обычно не нужны те же данные в рабочей среде, что и в разработке. При первом развертывании сайта обычно исключаются большинство или все учетные записи пользователей, создаваемые для тестирования. Таким образом, скачанный проект содержит две базы данных членства: aspnet-ContosoUniversity.mdf с пользователями разработки и aspnet-ContosoUniversity-Prod.mdf с рабочими пользователями. В этом руководстве имена пользователей одинаковы в обеих базах данных: admin и nonadmin. У обоих пользователей есть пароль devpwd в базе данных разработки и prodpwd в рабочей базе данных.

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

Примечание

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

Скрипты развертывания данных можно создавать вручную с помощью SQL Server Management Studio (SSMS) или с помощью стороннего средства. В оставшейся части этого руководства вы узнаете, как это сделать в SSMS, но если вы не хотите устанавливать и использовать SSMS, вы можете получить скрипты из готовой версии проекта и перейти к разделу, в котором они хранятся в папке решения.

Чтобы установить SSMS, установите его из Центра загрузки: Microsoft SQL Server 2012 Express, щелкнув ENU\x64\SQLManagementStudio_x64_ENU.exe или ENU\x86\SQLManagementStudio_x86_ENU.exe. Если вы выберете неправильный вариант для вашей системы, установить его не удастся, и вы можете попробовать другой.

(Обратите внимание, что это скачивание 600 мегабайт. Установка может занять много времени и потребует перезагрузки компьютера.)

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

Создание скрипта базы данных разработки

  1. Запустите SSMS.

  2. В диалоговом окне Подключение к серверу введите (localdb)\v11.0 в качестве имени сервера, оставьте параметр Проверка подлинностиWindows и нажмите кнопку Подключиться.

    SSMS Connect to Server

  3. В окне обозреватель объектов разверните узел Базы данных, щелкните правой кнопкой мыши aspnet-ContosoUniversity, выберите Задачи, а затем — Создать скрипты.

    Создание скриптов SSMS

  4. В диалоговом окне Создание и публикация скриптов щелкните Задать параметры скриптов.

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

  5. Щелкните Дополнительно.

    Параметры скриптов SSMS

  6. В диалоговом окне Дополнительные параметры скрипта прокрутите вниз до раздела Типы данных для написания скрипта и выберите параметр Только данные в раскрывающемся списке.

  7. Измените значение Script USE DATABASE на False. Инструкции USE недопустимы для базы данных Azure SQL и не требуются для развертывания для SQL Server Express в тестовой среде.

    Только данные скрипта SSMS, без инструкции USE

  8. Нажмите кнопку ОК.

  9. В диалоговом окне Создание и публикация скриптов в поле Имя файла указывается, где будет создан скрипт. Измените путь к папке решения (папке с файлом ContosoUniversity.sln) и имя файла на aspnet-data-dev.sql.

  10. Нажмите кнопку Далее , чтобы перейти на вкладку Сводка , а затем нажмите кнопку Далее еще раз, чтобы создать скрипт.

    Создан скрипт SSMS

  11. Нажмите кнопку Готово.

Создание скрипта рабочей базы данных

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

  1. В обозреватель объектов SSMS щелкните правой кнопкой мыши Базы данных и выберите пункт Присоединить.

    Подключение SSMS

  2. В диалоговом окне Присоединение баз данных нажмите кнопку Добавить и перейдите к файлу aspnet-ContosoUniversity-Prod.mdf в папке App_Data .

    Добавление MDF-файла SSMS для присоединения

  3. Нажмите кнопку ОК.

  4. Выполните ту же процедуру, которая использовалась ранее для создания скрипта для рабочего файла. Назовите файл скрипта aspnet-data-prod.sql.

Сводка

Теперь обе базы данных готовы к развертыванию, и в папке решения есть два сценария развертывания данных.

Скрипты развертывания данных

В следующем руководстве вы настроите параметры проекта, влияющие на развертывание, и настройте автоматическое преобразование файловWeb.config для параметров, которые должны отличаться в развернутом приложении.

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

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