приложение asp net с базой данных
ASP NET.MVC Урок 3. Работа с БД
Цель урока: Изучить основные принципы работы с базой данных. Краткое описание реляционной модели баз данных. Работа с базой данных (создание таблиц, связей в VS 2012). Команды INSERT, UPDATE, DELETE, SELECT. Использование LinqToSql и Linq. Создание репозитария, IRepository, SqlRepository.
Что такое БД
Таблицы
Это таблица:
Связи
Создание простой схемы в БД
Создадим БД в VS 2012:
Назовем её LessonProject, и добавим 3 таблицы Role User и UserRole.
Создадим таблицу Role:
Для строковых значений используем тип nvarchar(n), где n – максимальная длина строки, обычно используется от 50 до 500. Для больших текстовых строк используется nvarchar(MAX).
Устанавливаем первичный ключ:
Задаем для ID автоинкремент:
Подобным образом создаем таблицу User:
Поле | Тип поля |
ID | int |
nvarchar(150) | |
Password | nvarchar(50) |
AddedDate | datetime |
ActivatedDate | datetime (null) |
ActivatedLink | nvarchar(50) |
LastVisitDate | datetime (null) |
AvatarPath | nvarchar(150) (null) |
Создаем таблицу UserRole:
Поле | Тип поля |
ID | int |
UserID | int |
RoleID | int |
Добавляем новую связь, нажав Add. Добавление связей происходит в таблице, где находятся внешние ключи. Раскрываем вкладку Tables and Columns и выставляем таблицу с первичным ключом, и выбираем внешний ключ в текущей таблице UserRole.
В свойствах INSERT And UPDATE Specification выставляем On Update/On Delete свойства Cascade:
Это необходимо для того, чтобы при изменении/удалении столбца из таблицы Role все связанные с этой строкой строки таблицы UserRole должны быть изменены или удалены.
Аналогичную связь мы устанавливаем с таблицей User.
Таким образом, таблицы Role и User имеют отношения многие ко многим через таблицу UserRole. Т.е. у одного пользователя может быть больше одной роли, и одна и та же роль может быть у нескольких пользователей.
SELECT, INSERT, UPDATE, DELETE.
В реляционных базах данных используется язык запросов SQL.
Есть 4 основные команды для манипулирования данными — SELECT, INSERT, UPDATE, DELETE
SELECT – для выбора данных и таблиц.
Пример:
INSERT — Добавление строк в таблицу
Пример:
UPDATE – изменение значений в таблице
Пример:
DELETE – удаление строк из таблицы
Пример:
LinqToSQL и Linq.
Создадим проект LessonProject.Model для работы с БД типа ClassLibrary.
Добавляем LINQ to SQL Classes тип, называем LessonProejctDb.dbml
Открываем объект, выделяем все таблицы и мышкой переносим на холст:
Добавим несколько данных в таблицу Role и User:
1 | admin | Админ |
2 | customer | Заказчик |
1 | chernikov@gmail.com | 123456 | 1/1/2012 12:00:00 AM | NULL | 123456 | NULL | NULL |
2 | chernikov2@gmail.com | 123456 | 1/1/2012 12:00:00 AM | NULL | 123456 | NULL | NULL |
ID | UserID | RoleID |
1 | 1 | 1 |
2 | 1 | 2 |
3 | 2 | 2 |
Создадим консольный проект Lesson3 и подключим LessonProject.Model. Добавим сборку System.Configuration и System.Data.Linq. Проинициализируем context и выведем данные о ролях:
Для добавления строки в Role делаем так:
Для удаления строки в Role делаем так:
Для изменения данных делаем так:
Для манипуляции данных используется язык запросов Linq. Мы рассмотрим только некоторые основные функции Linq. Linq применяется для типов реализующий интерфейс IQueryable<>
Создание репозитория IRepository, SqlRepository.
Собственно с БД мы уже можем работать, только теперь нужно отделить модель данных от конкретной реализации, т.е. наши контроллеры про context и System.Data.Linq вообще не должны ничего знать.
Для этого создадим интерфейс IRepository, где будет дан доступ к данным, а также выведены методы для создания, изменения и удаления этих данных.
Реализацию назовем SqlRepository. Так как мы с данным контекстом SqlRepository не хотим особо связывать, то добавим Ninject модуль в проект LessonProject.Model:
Создадим класс SqlRepository:
Прежде, чем реализовать доступ ко всем таблицам, создание, удаление и изменение, подумаем о том, что файл этот будет выглядеть громадным и неуклюжим. Таким кодом будет управлять тяжело физически. Так что сделаем отдельную папку SqlRepository и SqlRepository класс сделаем partial, а в папке создадим реализации интерфейса IRepository, разбитые по каждой таблице. Назовем файл Role:
Небольшой проект содержит от 10 до 40 таблиц, большой проект от 40, и всё это хотелось бы как-то автоматизировать. Создадим несколько сниппетов, для IRepository и для SqlRepository. Сниппеты – это уже готовые шаблоны кода, которые вызываются с помощью intelliSence, и позволяют быстро создавать код.
Сниппеты
Для IRepository таблиц, создадим table.snippet:
Для SqlRepository создадим сниппет sqlTable.snippet:
Finish, OK.
Используем для таблиц User и UserRole.
Осталось прописать только поля для Update [имя таблицы], но это уже меньше работы.
Proxy
Как видим, классы, которые мы используем, являются partial, поэтому их можно дополнить. Создадим, подобно SqlRepository, папку Proxy, где будем размещать partial классы. Например, для класса User создадим метод, который автоматически генерирует строку, требуемую для активации пользователя:
Использование БД в asp.net mvc
Добавим строку доступа к БД в web.Config:
Проинициализируем работу с БД в Ninject:
Применяем InRequestScope(). Т.е. каждый запрос будет использовать отдельный объект SqlRepository. Это позволит избежать коллизий при исполнении.Объявляем IRepository в контроллере:
Часть 5. Работа с базой данных в приложении MVC ASP.NET Core
Авторы: Рик Андерсон (Rick Anderson) и Джон П. Смит (Jon P Smith)
Объект MvcMovieContext обрабатывает задачу подключения к базе данных и сопоставления объектов Movie с записями базы данных. Контекст базы данных регистрируется с помощью контейнера внедрения зависимостей в методе ConfigureServices в файле Startup.cs:
Если приложение развертывается на тестовом или рабочем сервере, можно задать строку подключения к рабочему SQL Server с помощью переменной среды. Дополнительные сведения см. в разделе Конфигурация.
SQL Server Express LocalDB
Проверка базы данных
В меню Вид откройте обозреватель объектов SQL Server (SSOX).
Щелкните правой кнопкой мыши таблицу Movie и выберите Конструктор представлений.
Щелкните правой кнопкой мыши таблицу Movie и выберите Просмотр данных.
SQLite
На веб-сайте SQLite указывается следующее:
SQLite — это автономная внедряемая полнофункциональная общедоступная система управления базами данных SQL с высокой степенью надежности. На данный момент SQLite является самой популярной СУБД в мире.
Для просмотра баз данных SQLite, а также управления ими можно использовать множество самых разных сторонних инструментов. На следующем рисунке показан DB Browser для SQLite. Если вы предпочитаете использовать другое средство для работы с SQLite, напишите нам в комментариях, чем именно оно нравится вам.
В этом руководстве используется функция миграции Entity Framework Core, где это возможно. Во время миграции обновляется схема базы данных в соответствии с изменениями в модели данных. Но миграции могут вносить только изменения, которые поддерживает поставщик EF Core, а возможности поставщика SQLite ограничены. Например, добавление столбца поддерживается, но удаление или изменение столбца не поддерживается. Если миграция создается для удаления или изменения столбца, команда ef migrations add выполняется успешно, а команда ef database update — нет. Из-за этих ограничений в этом руководстве не используются миграции для изменения схемы SQLite. Вместо этого при изменении схемы нужно удалить и снова создать базу данных.
Обходной путь для ограничений SQLite — вручную написать код миграции для перестроения таблицы в случае изменений. Перестроение таблицы включает в себя:
Дополнительные сведения см. в следующих ресурсах:
Заполнение базы данных
Создайте класс SeedData в папке Models. Замените сгенерированный код следующим кодом:
Если в базе данных есть фильмы, возвращается инициализатор заполнения и фильмы не добавляются.
Добавление инициализатора заполнения
Замените содержимое Program.cs кодом из этого примера.
Проверьте работу приложения.
Удалите все записи в базе данных. Это можно сделать с помощью ссылок удаления в браузере или из SSOX.
Щелкните правой кнопкой мыши значок IIS Express в области уведомлений и выберите Выйти или Остановить сайт.
Удалите все записи в базе данных. Останавливает и запускает приложение, поэтому метод SeedData.Initialize выполняет и заполняет базу данных.
В приложении будут отображены данные.
Авторы: Рик Андерсон (Rick Anderson) и Джон П. Смит (Jon P Smith)
Объект MvcMovieContext обрабатывает задачу подключения к базе данных и сопоставления объектов Movie с записями базы данных. Контекст базы данных регистрируется с помощью контейнера внедрения зависимостей в методе ConfigureServices в файле Startup.cs:
Если приложение развертывается на тестовом или рабочем сервере, можно задать строку подключения к рабочему SQL Server с помощью переменной среды. Дополнительные сведения см. в разделе Конфигурация.
SQL Server Express LocalDB
Проверка базы данных
В меню Вид откройте обозреватель объектов SQL Server (SSOX).
Щелкните правой кнопкой мыши таблицу Movie и выберите Конструктор представлений.
Щелкните правой кнопкой мыши таблицу Movie и выберите Просмотр данных.
SQLite
На веб-сайте SQLite указывается следующее:
SQLite — это автономная внедряемая полнофункциональная общедоступная система управления базами данных SQL с высокой степенью надежности. На данный момент SQLite является самой популярной СУБД в мире.
Для просмотра баз данных SQLite, а также управления ими можно использовать множество самых разных сторонних инструментов. На следующем рисунке показан DB Browser для SQLite. Если вы предпочитаете использовать другое средство для работы с SQLite, напишите нам в комментариях, чем именно оно нравится вам.
В этом руководстве используется функция миграции Entity Framework Core, где это возможно. Во время миграции обновляется схема базы данных в соответствии с изменениями в модели данных. Но миграции могут вносить только изменения, которые поддерживает поставщик EF Core, а возможности поставщика SQLite ограничены. Например, добавление столбца поддерживается, но удаление или изменение столбца не поддерживается. Если миграция создается для удаления или изменения столбца, команда ef migrations add выполняется успешно, а команда ef database update — нет. Из-за этих ограничений в этом руководстве не используются миграции для изменения схемы SQLite. Вместо этого при изменении схемы нужно удалить и снова создать базу данных.
Обходной путь для ограничений SQLite — вручную написать код миграции для перестроения таблицы в случае изменений. Перестроение таблицы включает в себя:
Дополнительные сведения см. в следующих ресурсах:
Заполнение базы данных
Создайте класс SeedData в папке Models. Замените сгенерированный код следующим кодом:
Если в базе данных есть фильмы, возвращается инициализатор заполнения и фильмы не добавляются.
Добавление инициализатора заполнения
Замените содержимое Program.cs кодом из этого примера.
Проверьте работу приложения.
Удалите все записи в базе данных. Это можно сделать с помощью ссылок удаления в браузере или из SSOX.
Щелкните правой кнопкой мыши значок IIS Express в области уведомлений и выберите Выйти или Остановить сайт.
ASP.NET Web API + Entity Framework + Microsoft SQL Server + Angular. Часть 1
Введение
Небольшой курс по созданию простого веб-приложения с помощью технологий ASP.NET Core, фреймворка Entity Framework, СУБД Microsoft SQL Server и фреймворка Angular. Тестировать Web API будем через приложение Postman.
Курс состоит из нескольких частей:
Часть 1. Создание Web API с помощью ASP.NET Web API и Entity Framework Core
В качестве примера будем расматривать уже ставшее классическим — приложение списка дел. Для разработки приложения я буду использовать Visual Studio 2019(в Visual Studio 2017 процесс аналогичен).
Создание проекта
Создадим новый проект ASP.NET Core Web Application в Visual Studio:
Назовем приложение и укажем путь к каталогу с проектом:
И выберем шаблон приложения API:
Модель
Создадим каталог Models и в новый каталог добавим первый класс TodoItem.cs, объекты которого будут описывать некоторые задачи списка дел в приложении:
В качестве СУБД мы будем использовать Sql Server, а доступ к базе данных будет осуществляться через Entity Framework Core и для начала установим фреймворк через встроенный пакетный менеджер NuGet:
Одним из подходов в работе с Entity Framework является подход «Code-First». Суть подхода заключается в том, что на основе модели приложения(в нашем случае модель представляет единственный класс — TodoItem.cs) формируется струткура базы данных(таблицы, первичные ключи, ссылки), вся эта работа происходит как бы «за кулисами» и напрямую с SQL мы не работаем. Обязательным условием класса модели является наличие поля первичного ключа, по умолчанию Entity Framework ищет целочисленное поле в имени которого присутствует подстрока «id» и формирует на его основе первичный ключ. Переопределить такое поведение можно с помощью специальных атрибутов или используя возможности Fluent API.
Главным компонентом в работе с Entity Framework является класс контекста базы данных, через который собственно и осуществляется доступ к данным в таблицах:
Базовый класс DbContext создает контекст БД и обеспечивает доступ к функциональности Entity Framework.
Для хранения данных приложения мы будем использовать SQL Server 2017 Express. Строки подключения хранятся в файле JSON под названием appsettings.json:
Далее нужно внести изменения в класс Startup.cs, добавив в метод ConfigureServices() следующий код:
Метод AddDbContext() настраивает службы, предоставляемые инфраструктурой Entity Framework Core для класса контекста базы EFTodoDBContext. Аргументом метода AddDbContext () является лямбда-выражение, которое получает объект options, конфигурирующий базу данных для класса контекста. В этом случае база данных конфигурируется с помощью метода UseSqlServer() и указания строки подключения.
Определим основные операции для работы с задачами в интерфейсе ITodoRepository:
Данный интерфейс позволяет нам не задумываться о конкретной реализации хранилища данных, возможно мы точно не определились с выбором СУБД или ORM фреймворком, сейчас это не важно, класс описывающий доступ к данным будет наследовать от этого интерфейса.
Реализуем репозиторий, который как уже сказано ранее, будет наследовать от ITodoRepository и использовать в качестве источника данных EFTodoDBContext:
Контроллер
Контроллер, реализация которого будет описана ниже, ничего не будет знать о контексте данных EFTodoDBContext, а будет использовать в своей работе только интерфейс ITodoRepository, что позволяет изменить источник данных не меняя при этом контроллера. Такой подход Адам Фримен в своей книге «Entity Framework Core 2 для ASP.NET Core MVC для профессионалов» назвал — паттерн «Хранилище».
Контроллер реализует обработчики стандартных методов HTTP-запросов: GET, POST, PUT, DELETE, которые будут изменять состояние наших задач, описанных в классе TodoItem.cs.
Добавим в каталог Controllers класс TodoController.cs со следующим содержимым:
Перед определением класса указан атрибут с описанием шаблона маршрута для доступа к контроллеру: [Route(«api/[controller]»)]. Контроллер TodoController будет доступен по следующему маршруту: https:// : /api/todo. В [controller] указывается название класса контроллера в нижнем регистре, опуская часть «Controller».
Перед определением каждого метода в контроллере TodoController указан специальный атрибут вида: [ («параметр»,Name = «псевдоним метода»)]. Атрибут определяет какой HTTP-запрос будет обработан данным методом, параметр, который передается в URI запроса и псевдоним метода с помощью которого можно переотправлять запрос. Если не указать атрибут, то по умолчанию инфраструктура MVC попытается найти самый подходящий метод в контроллере для обработки запроса исходя из названия метода и указанных параметров в запросе, так, если не указать в контроллере TodoController атрибут для метода Get(), то при HTTP-запросе методом GET: https:// : /api/todo, инфраструткура определит для обработки запроса метод Get() контроллера.
В своем конструкторе контроллер получает ссылку на объект типа ITodoRepository, но пока что инфраструктура MVC не знает, какой объект подставить при создании контроллера. Нужно создать сервис, который однозначно разрешит эту зависисмость, для этого внесем некотрые изменения в класс Startup.cs, добавив в метод ConfigureServices() следующий код:
Метод AddTransient () определяет сервис, который каждый раз, когда требуется экземпляр типа ITodoRepository, например в контроллере, создает новый экземпляр класс EFTodoRepository.
Полный код класса Startup.cs:
Миграции
Для того чтобы Entity Framework сгенерировал базу данных и таблицы на основе модели, нужно использовать процесс миграции базы данных. Миграции — это группа команд, которая выполняет подготовку базы данных для работы с Entity Framework. Они используются для создания и синхронизации базы данных. Команды можно выполнять как в консоли диспетчера пакетов (Package Manager Console), так и в Power Shell(Developer Power Shell). Мы будем использовать консоль диспетчера пакетов, для работы с Entity Framework потребуется установить пакет Microsoft.EntityFrameworkCore.Tools:
Запустим консоль диспетчера пакетов и выполним команду Add-Migration Initial:
В проекте появится новый каталог — Migrations, в котором будут хранится классы миграции, на основе которых и будут создаваться объекты в базе данных после выполнения команды Update-Database:
Web API готово, запустив приложение на локальном IIS Express мы можем протестировать работу контроллера.
Тестирование WebAPI
Создадим новую коллекцию запросов в Postman под названием TodoWebAPI:
Так как наша база пуста, протестируем для начала создание новой задачи. В контроллере за создание задач отвечает метод Create(), который будет обрабатывать HTTP запрос отправленный методом POST и будет содержать в теле запроса сериализированный объект TodoItem в JSON формате. Аттрибут [FromBody] перед параметром todoItem в методе Create() подсказывает инфраструктуре MVC, что нужно десериализировать объект TodoItem из тела запроса и передать его в качестве параметра методу. Создадим запрос в Postman, который отправит на webAPI запрос на создание новой задачи:
Метод Create() после успешного создания задачи перенаправляет запрос на метод Get() с псевдонимом «GetTodoItem» и передает в качестве параметра Id только что созданной задачи, в результате чего в ответ на запрос мы получим созданный объект задачи в формате JSON.
Отправив HTTP запрос методом PUT и указав при этом в URI Id(https://localhost:44370/api/todo/1) уже созданного объекта, а в теле запроса передав объект с некоторыми изменениями в формате JSON, мы изменим этот объект в базе:
HTTP запросом с методом GET без указания параметров получим все объекты в базе:
Запрос HTTP с методом DELETE и указанием Id объекта в URI(https://localhost:44370/api/todo/2), удалит объект из базы и вернет JSON с удаленной задачей:
На этом все, в следующей части реализуем пользовательский интерфейс с помощью JavaScript-фреймворка Angular.