Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой серии руководств показано, как развернуть (опубликовать) проект веб-приложения ASP.NET, содержащий базу данных SQL Server Compact, используя Visual Studio 2012 RC (Версия-кандидат) или Visual Studio Express 2012 RC (Версия-кандидат) для веб-версий. Вы также можете использовать Visual Studio 2010, если установить обновление веб-публикации. Общие сведения о серии см. в первом руководстве серии.
В руководстве, показывающем функции развертывания, представленные после выпуска RC Visual Studio 2012, демонстрируется, как развертывать выпуски SQL Server, отличные от SQL Server Compact, и как развертывать в службе веб-приложений Azure App Service. См. ASP.NET Веб-развертывание с помощью Visual Studio.
Обзор
В этом руководстве показано, как настроить две базы данных SQL Server Compact и ядро СУБД для развертывания.
Для доступа к базе данных приложению Contoso University требуется следующее программное обеспечение, которое должно быть развернуто с приложением, так как оно не входит в .NET Framework:
- SQL Server Compact (ядро СУБД).
- ASP.NET универсальные поставщики (которые позволяют системе членства ASP.NET использовать SQL Server Compact)
- Entity Framework 5.0(Code First с миграциями).
Структура базы данных и некоторые (не все) данные в двух базах данных приложения также должны быть развернуты. Как правило, при разработке приложения вы вводите тестовые данные в базу данных, которую вы не хотите развернуть на динамическом сайте. Однако вы также можете ввести некоторые рабочие данные, которые вы хотите развернуть. В этом руководстве вы настроите проект Contoso University таким образом, чтобы необходимое программное обеспечение и правильные данные были включены при развертывании.
Напоминание. Если вы получаете сообщение об ошибке или что-то не работаете по мере прохождения руководства, обязательно проверьте страницу устранения неполадок.
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 Toolbox и служебная программа скрипта схемы и данных 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:
- SqlServerCompact
- System.Web.Providers (ASP.NET универсальные поставщики)
- EntityFramework
- EntityFramework.SqlServerCompact
Ссылки указывают на текущие версии этих пакетов, которые могут быть более новыми, чем то, что установлено в начальном проекте, который вы скачали для этого руководства. Для развертывания в поставщике услуг размещения убедитесь, что вы используете 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 проекта, однако сценарий не добавляет эти папки в проект. В результате Web Deploy не будет копировать их на целевой веб-сайт, если их не включить вручную в проект. (Это поведение приводит к конфигурации развертывания по умолчанию; другим вариантом, который вы не будете использовать в этих руководствах, является изменение параметра, который управляет этим поведением. Параметр, который можно изменить, — это только файлы, необходимые для запуска приложения в разделе "Элементы" для развертывания на вкладке "Веб-пакет или публикация" окна "Свойства проекта ". Изменение этого параметра обычно не рекомендуется, так как это может привести к развертыванию большего количества файлов в рабочей среде, чем требуется. Дополнительные сведения об альтернативных вариантах см. в руководстве по настройке свойств проекта .)
Создайте проект, а затем в обозревателе решений щелкните "Показать все файлы ", если это еще не сделано. Также может потребоваться нажать кнопку "Обновить".
Разверните папку bin , чтобы просмотреть папки amd64 и x86 , а затем выберите эти папки, щелкните правой кнопкой мыши и выберите "Включить в проект".
Значки папок изменяются, чтобы показать, что папка включена в проект.
Настройка первых миграций кода для развертывания базы данных приложений
При развертывании базы данных приложения обычно не просто развертываете базу данных разработки со всеми данными в рабочей среде, так как большая часть данных в ней, вероятно, существует только для тестирования. Например, имена учащихся в тестовой базе данных вымышлены. С другой стороны, часто невозможно развернуть только структуру базы данных без каких-либо данных в ней. Некоторые данные в тестовой базе данных могут быть реальными данными и должны быть там, когда пользователи начинают использовать приложение. Например, в базе данных может быть таблица, содержащая допустимые значения оценок или имена реальных отделов.
Чтобы имитировать этот распространенный сценарий, вы настроите Seed метод в Code First Migrations, который вставляет в базу данных только те данные, которые требуется поместить в производственную среду. Этот метод Seed не будет вставлять тестовые данные, так как он будет выполняться в производственной среде после создания базы данных.
В более ранних версиях Code First до выпуска Migrations было распространено использование методов Seed для вставки тестовых данных, так как при каждом изменении модели во время разработки база данных должна быть полностью удалена и создана с нуля. При использовании миграций Code First тестовые данные сохраняются после изменений базы данных, поэтому включение тестовых данных в метод Seed не требуется. Скачанный проект использует метод предварительной миграции, включая все данные в метод Seed класса инициализатора. В этом руководстве вы отключите класс инициализатора и включите миграцию. Затем вы обновите метод Seed в классе конфигурации Migrations, чтобы он вставлял только те данные, которые вы хотите вставить в рабочую среду.
На следующей схеме показана схема базы данных приложения:
В этих руководствах предполагается, что StudentEnrollment таблицы должны быть пустыми при первом развертывании сайта. Другие таблицы содержат данные, которые должны быть предварительно загружены при запуске приложения.
Поскольку вы будете использовать 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.SetInitializerApplication_Start метода в файле Global.asax . Если вы включаете миграции в проекте, использующего этот метод для указания инициализатора, удалите эту строку кода.
Затем включите Code First Migrations.
Первым шагом является обеспечение того, чтобы проект ContosoUniversity был задан в качестве запускаемого проекта. В обозревателе решений щелкните правой кнопкой мыши проект ContosoUniversity и выберите "Задать в качестве запускаемого проекта". Миграция Code First будет искать в стартовом проекте строку подключения к базе данных.
В меню Сервис щелкните Диспетчер пакетов NuGet, а затем щелкните Консоль диспетчера пакетов.
В верхней части окна консоли диспетчера пакетов выберите ContosoUniversity.DAL в качестве проекта по умолчанию, а затем в командной PM> строке введите "enable-migrations".
Эта команда создает файл Configuration.cs в новой папке Migrations в проекте ContosoUniversity.DAL.
Вы выбрали проект 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 и нажмите Разрешить, затем выберите using System.Collections.Generic.
Этот пункт меню добавляет следующий код в using инструкции, расположенные в верхней части файла.
using System.Collections.Generic;
Замечание
Добавление кода в Seed метод является одним из многих способов вставки фиксированных данных в базу данных. Альтернативой может быть добавление кода в методы Up и Down каждого класса миграции.
Up Методы Down содержат код, реализующий изменения базы данных. Вы увидите примеры из них в руководстве по развертыванию обновления базы данных .
Вы также можете написать код, выполняющий инструкции SQL с помощью Sql метода. Например, если вы добавляете столбец "Бюджет" в таблицу Department и хотите инициализировать все бюджеты отдела до $1,000.00 в рамках миграции, вы можете добавить следующую строку кода в Up метод для этой миграции:
Sql("UPDATE Department SET Budget = 1000");
В показанном примере этого руководства используется метод AddOrUpdate в методе Seed класса Code First Migrations Configuration. Code First Migrations вызывает Seed метод после каждой миграции, и этот метод обновляет строки, которые уже вставлены, или вставляет их, если они еще не существуют. Метод AddOrUpdate может быть не лучшим вариантом для вашего сценария. Для получения дополнительной информации см. в записи "Будьте внимательны с методом EF 4.3 AddOrUpdate" на блоге Джули Лерман.
Нажмите клавиши CTRL-SHIFT-B, чтобы создать проект.
Следующим шагом является создание класса для начальной DbMigration миграции. Вы хотите, чтобы эта миграция создавала новую базу данных, поэтому необходимо удалить базу данных, которая уже существует. Базы данных SQL Server Compact содержатся в SDF-файлах в папке App_Data . В обозревателе решений разверните App_Data в проекте ContosoUniversity, чтобы увидеть две базы данных SQL Server Compact, представленные файлами SDF .
Щелкните правой кнопкой мыши файл School.sdf и нажмите кнопку "Удалить".
В окне консоли диспетчера пакетов введите команду add-migration Initial, чтобы создать начальную миграцию и назовите ее "Initial".
Code First Migrations создает другой файл класса в папке Migrations , и этот класс содержит код, который создает схему базы данных.
В консоли диспетчер пакетов введите команду update-database, чтобы создать базу данных и запустить метод Seed.
(Если возникает ошибка, указывающая, что таблица уже существует и не может быть создана, вероятно, это связано с тем, что вы запустили приложение после удаления базы данных и перед выполнением. update-database В этом случае удалите файл School.sdf еще раз и повторите update-database команду.)
Запустите приложение. Теперь страница "Учащиеся" пуста, но страница "Преподаватели" содержит инструкторов. Это то, что вы получите в рабочей среде после развертывания приложения.
Проект теперь готов к развертыванию базы данных School .
Создание базы данных членства для развертывания
Приложение Contoso University использует систему членства ASP.NET и аутентификацию на основе форм для аутентификации и авторизации пользователей. Одна из ее страниц доступна только администраторам. Чтобы увидеть эту страницу, запустите приложение и выберите "Обновить кредиты" в меню всплывающего меню в разделе "Курсы". Приложение отображает страницу входа , так как только администраторы могут использовать страницу "Обновить кредиты ".
Войдите в систему как "admin", используя пароль "Pas$w0rd" (обратите внимание на нуль вместо буквы "o" в "w0rd"). После входа отобразится страница "Обновить кредиты ".
При первом развертывании сайта обычно исключается большинство учетных записей пользователей, создаваемых для тестирования. В этом случае вы создадите учетную запись администратора, но не будете создавать учетные записи пользователей. Вместо того чтобы вручную удалять тестовые учетные записи, вы создадите новую базу данных членства, которая содержит только одну учетную запись администратора, необходимую в рабочей среде.
Замечание
База данных членства хранит хэш паролей учетных записей. Чтобы развернуть учетные записи с одного компьютера на другой, необходимо убедиться, что хэш-процедуры не создают разные хэши на целевом сервере, чем на исходном компьютере. Они будут создавать те же хэши при использовании ASP.NET универсальных провайдеров, если алгоритм по умолчанию не изменяется. Алгоритм по умолчанию HMACSHA256 и указан в атрибуте проверки элемента machineKey в файле Web.config.
База данных членства не поддерживается Code First Migrations, и отсутствует автоматический инициализатор, который бы заполнял базу данных тестовыми учетными записями, как это происходит для учебной базы данных. Таким образом, чтобы обеспечить доступность тестовых данных, необходимо сделать копию тестовой базы данных перед созданием новой.
В обозревателе решений переименуйте файл aspnet.sdf в папке App_Data на aspnet-Dev.sdf. (Не создавайте копию, просто переименуйте ее— вы создадите новую базу данных в данный момент.)
В обозревателе решений убедитесь, что выбран веб-проект (ContosoUniversity, а не ContosoUniversity.DAL). Затем в меню "Проект" выберите Конфигурация ASP.NET, чтобы запустить Средство администрирования веб-сайта (WAT).
Выберите вкладку Безопасность.
Нажмите кнопку "Создать роли" или "Управление ролями " и добавьте роль администратора .
Вернитесь на вкладку "Безопасность" , нажмите кнопку "Создать пользователя" и добавьте пользователя "admin" в качестве администратора. Прежде чем нажать кнопку "Создать пользователя" на странице "Создать пользователя ", установите флажок "Администратор ". Пароль, используемый в этом руководстве, — "Pas$w0rd", и вы можете ввести любой адрес электронной почты.
Закройте браузер. В обозревателе решений нажмите кнопку обновления, чтобы увидеть новый файл aspnet.sdf .
Щелкните правой кнопкой мыши aspnet.sdf и выберите "Включить в проект".
Отличие разработки от рабочих баз данных
В этом разделе вы переименуете базы данных, чтобы версии разработки были School-Dev.sdf и aspnet-Dev.sdf, а рабочие версии — School-Prod.sdf и aspnet-Prod.sdf. Это не обязательно, но поможет вам не путать тестовые и рабочие версии баз данных.
В обозревателе решений щелкните "Обновить " и разверните папку App_Data, чтобы просмотреть созданную ранее базу данных School; Щелкните его правой кнопкой мыши и выберите "Включить в проект".
Переименуйте 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 см. в статье "Создание и публикация файла пакета ифайла конфигурации" и преобразования исходного кода.