Главная страница   /   7.4. Подготовка базы данных (ASP.NET MVC 4

ASP.NET MVC 4

ASP.NET MVC 4

Адам Фриман

7.4. Подготовка базы данных

Мы уже можем отображать простые представления, содержащие информацию о товарах, но мы по-прежнему выводим тестовые данные, которые возвращает наше имитированное хранилище IProductRepository. Прежде чем мы сможем реализовать реальное хранилище, нам нужно создать базу данных и заполнить ее данными.

В качестве базы данных мы будем использовать SQL Server и обращаться к ней с помощью Entity Framework (EF), которая является ORM-платформой .NET. Платформа ORM позволяет нам работать с таблицами, столбцами и строками в реляционной базе данных с помощью обычных объектов C#. Мы уже упоминали в главе 6, что LINQ может работать с различными источниками данных, одним из которых является Entity Framework. Вы вскоре увидите, как она упрощает работу.

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

Мы используем Entity Framework по нескольким причинам. Во-первых, ее легко настроить и начать работу. Во-вторых, мы хотим использовать LINQ, а у нее первоклассная интеграция с LINQ. Третья причина заключается в том, что Entity Framework на самом деле очень хорошая платформа. Более ранние версии были немного неточными, но современные версии многофункциональны и отлично работают.

Создаем базу данных

Одно из приятных дополнений к Visual Studio 2012 и SQL Server 2012 - версия LocalDB. Это безадминистративная реализация функций ядра SQL Server, предназначенных только для разработчиков. Используя эту версию, мы можем пропустить процесс настройки базы данных, пока мы создаем проект, а затем развернуть приложение на полном экземпляре SQL Server. Большинство приложений MVC развертываются на удаленных платформах, которые находятся в ведении профессиональных администраторов. Версия LocalDB означает, что конфигурацию базы данных можно оставить администраторам баз данных, а разработчики смогут заняться кодированием. Версия LocalDB автоматически устанавливается вместе с Visual Studio Express 2012 for Web, но при желании вы можете скачать ее непосредственно с сайта www.microsoft.com/SQLServer.

Для начала мы создадим соединение с базой данных в Visual Studio. Откройте Database Explorer в меню View и кликните по кнопке Connect to Database (которая выглядит как кабель питания с зеленым плюсом).

Вы увидите диалоговое окно Add Connection. Присвойте серверу имя (localdb)\v11.0 - это специальное имя, которое означает, что вы хотите использовать версию LocalDB. Отметьте флажком опцию Use Windows Authentication и назовите базу данных SportsStore, как показано на рисунке 7-7.

Рисунок 7-7: Настраиваем базу данных SportsStore

Нажмите ОК, и вам будет предложено создать новую базу данных. Нажмите Yes, и в окне Database Explorer появится новая запись. Разверните этот пункт, чтобы увидеть различные аспекты новой базы данных, как показано на рисунке 7-8.

Рисунок 7-8: База данных LocalDB в окне Database Explorer

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

Определяем схему базы данных

В нашей базе данных нам нужна только одна таблица, в которой мы будем хранить объекты Product. В окне Database Explorer разверните базу данных, которую вы только что создали, и кликните правой кнопкой мыши по пункту Tables. Выберите из меню Add - New Table, как показано на рисунке 7-9.

Рисунок 7-9: Добавляем новую таблицу

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

Листинг 7-10: SQL-оператор для создания таблицы в базе данных SportsStore
CREATE TABLE Products
(
	[ProductID] INT NOT NULL PRIMARY KEY IDENTITY,
	[Name] NVARCHAR(100) NOT NULL,
	[Description] NVARCHAR(500) NOT NULL,
	[Category] NVARCHAR(50) NOT NULL,
	[Price] DECIMAL(16, 2) NOT NULL
)

Этот оператор создает таблицу под названием Products, которая содержит столбцы для различных свойств, которые мы определили в классе модели Product ранее в этой главе.

Совет

Настройка свойства IDENTITY для столбца ProductID означает, что SQL Server будет генерировать уникальный первичный ключ, когда мы добавляем данные в эту таблицу. Когда мы используем базу данных в приложении, будет очень трудно генерировать уникальные первичные ключи, потому что запросы от пользователей приходят одновременно. Если мы включим эту функцию, то сможем сохранять новые строки таблицы, причем назначать уникальные ключи будет SQL Server.

Когда вы нажмете кнопку Update, вам будет показана информация об эффекте оператора, как показано на рисунке 7-10.

Рисунок 7-10: Информация об эффекте SQL-оператора

Нажмите кнопку Update Database, чтобы выполнить SQL и создать таблицу Products в базе данных.Вы сможете увидеть эффект обновления, если нажмете на кнопку Refresh в окне Database Explorer. Раздел Tables показывает новую таблицу Product и информацию о каждой строке.

Совет

После обновления базы данных вы можете закрыть окно dbo.Products. Visual Studio предложит сохранить SQL-скрипт, который вы использовали для создания базы данных. Вам не нужно его сохранять в этой главе, но это может быть полезно сделать в реальных проектах, если вам понадобится настраивать несколько баз данных.

Добавляем данные в базу данных

Мы добавим в базу некоторые данные вручную, чтобы было с чем работать до тех пор, пока не добавим средства администрирования каталога в главе 10.

В окне Database Explorer разверните пункт Tables базы данных SportsStore кликните правой кнопкой мыши таблицу Products и выберите Show - Table Data. Введите данные, показанные на рисунке 7-11. Переходить на другую строку можно с помощью клавиши Tab. Нажимая Tab в конце каждой строки, вы перейдете к следующей строке и обновите данные в базе.

Внимание

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

Рисунок 7-11: Добавляем данные в таблицу Products

Создаем контекст Entity Framework

Последние версии Entity Framework включает отличную возможность под названием code-first. Смысл том, что мы можем определить классы в нашей модели, а затем сгенерировать базы данных из этих классов.

Это очень удобно для проектов, которые разрабатываются с нуля. Но так как таких проектов очень мало, мы продемонстрируем вам версию code-first, в которой будем связывать классы моделей с существующей базой данных. Для начала мы добавим версию Entity Framework 5.0 в проект SportsStore.Domain. Кликните правой кнопкой мыши пункт References в Solution Explorer, а затем выберите пункт Manage NuGet Packages в контекстном меню. Введите entity в поле поиска и выберите поиск пакета EntityFramework, как показано на рисунке 7-12, а затем нажмите кнопку Install. Visual Studio скачает и установит последнюю версию пакета Entity Framework.

Рисунок 7-12: Добавляем библиотечный пакет EntityFramework

Следующим шагом будет создание класса контекста, который будет связывать нашу простую модель с базой данных. Создайте новую папку под названием Concrete и добавьте в нее класс под названием EFDbContext. Отредактируйте содержимое файла так, как показано в листинге 7-11.

Листинг 7-11: Класс EFDbContext
using SportsStore.Domain.Entities;
using System.Data.Entity;

namespace SportsStore.Domain.Concrete
{
	public class EFDbContext : DbContext
	{
		public DbSet<Product> Products { get; set; }
	}
}

Чтобы воспользоваться возможностью code-first, мы должны создать класс, который наследует от System.Data.Entity.DbContext. Этот класс будет автоматически определять свойство для каждой таблицы в базе данных, с которой мы будем работать.

Имя свойства указывает таблицу, а параметр типа результата DbSet конкретизирует модель, которую должна использовать Entity Framework для репрезентации строк в данной таблице. В нашем случае свойство называется Products, тип - Product. Для репрезентации строк в таблице Products мы хотим использовать тип модели Product.

Мы должны сообщить Entity Framework, как подключаться к базе данных, и для этого мы добавляем строку подключения к базе данных в файл Web.config в проекте SportsStore.WebUI, которая имеет то же имя, что и класс контекста, как показано в листинге 7-12.

Совет

Обратите внимание, что здесь мы перешли на другой проект. Мы определяем модель и логику хранения данных в проекте SportsStore.Domain, но информацию о подключении к базе данных помещаем в файле Web.config в проекте SportsStore.WebUI.

Листинг 7-12: Добавляем подключение к базе данных
<connectionStrings>
	<add name="EFDbContext" 
				connectionString="Data Source=(localdb)\v11.0;Initial Catalog=SportsStore;Integrated Security=True" 
				providerName="System.Data.SqlClient"/>
</connectionStrings>

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

Создаем хранилище Product

Теперь у нас есть все, что нужно, чтобы реализовать реальный класс IProductRepository. Добавьте класс под названием EFProductRepository в папку Concrete проекта SportsStore.Domain. Измените файл класса так, чтобы он соответствовал листингу 7-13.

Листинг 7-13: EFProductRepostory.cs
using SportsStore.Domain.Abstract;
using SportsStore.Domain.Entities;
using System.Linq;

namespace SportsStore.Domain.Concrete
{
	public class EFProductRepository : IProductRepository
	{
		private EFDbContext context = new EFDbContext();
		public IQueryable<Product> Products
		{
			get { return context.Products; }
		}
	}
}

Это наш класс хранилища. Он реализует интерфейс IProductRepository и использует экземпляр EFDbContext, чтобы извлекать данные из базы с помощью Entity Framework. Мы продемонстрируем приемы работы с Entity Framework (и насколько они простые), когда будем добавлять в хранилище новые функции.

Наконец мы заменим привязку Ninject к нашему имитированному хранилищу на привязку к реальному хранилищу. Отредактируйте класс NinjectControllerFactory в проекте SportsStore.WebUI так, чтобы метод AddBindings соответствовал листингу 7-14.

Листинг 7-14: Добавляем привязку к реальному хранилищу
using System;
using System.Web.Mvc;
using System.Web.Routing;
using Ninject;
using SportsStore.Domain.Entities;
using SportsStore.Domain.Abstract;
using System.Collections.Generic;
using System.Linq;
using Moq;
using SportsStore.Domain.Concrete;

namespace SportsStore.WebUI.Infrastructure
{
	public class NinjectControllerFactory : DefaultControllerFactory
	{
		private IKernel ninjectKernel;
		public NinjectControllerFactory()
		{
			ninjectKernel = new StandardKernel();
			AddBindings();
		}

		protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
		{
			return controllerType == null
				? null
				: (IController)ninjectKernel.Get(controllerType);
		}

		private void AddBindings()
		{
			ninjectKernel.Bind<IProductRepository>().To<EFProductRepository>();
		}
	}
}

Новая привязка выделена жирным шрифтом. Она сообщает Ninject, что мы хотим создавать экземпляры класса EFProductRepository для обслуживания запросов к интерфейсу IProductRepository. Теперь остается только запустить приложение еще раз. Результаты показаны на рисунке 7-13, и вы можете видеть, что сейчас наш список содержит данные о товарах, которые мы занесли в базу данных.

Рисунок 7-13: Результат реализации реального хранилища

Этот подход использования Entity Framework для представления базы данных SQL Server как серии объектов модели - очень простой, и он позволяет нам оставаться сфокусированными на MVC Framework. Конечно, мы пропускаем много деталей касательно того, как работает Entity Framework, и огромное количество доступных опций конфигурации. Нам действительно нравится Entity Framework, и мы рекомендуем вам потратить немного времени и познакомиться с ним более подробно. Начать можно с сайта Microsoft для Entity Framework: http://msdn.microsoft.com/data/ef.