Описание тестовой БД
Тестовая БД
Описание таблиц
Roles – список ролей
Столбец | За что отвечает | Тип данных | Ограничения |
role_id | идентификатор роли | int | pk identity(1,1) |
role_name | имя роли | varchar(50) | not null |
Будет 3 роли:
- Админ
- Инженер
- Заведующий кафедрой
TaskStatus – список статусов задач
Столбец | За что отвечает | Тип данных | Ограничения |
task_status_id | идентификатор статуса задачи | int | pk identity(1,1) |
task_status_name | имя статуса задачи | varchar(50) | not null |
Будут следующие статусы задач:
- Открыто (этот статус означает, что задача создана, но ещё не взята в работу)
- В работе (этот статус означает, что над задачей серьёзно работают)
- Проверка (этот статус означает, что задача находится на верификации)
- Готово (этот статус означает, что задача выполнена)
TaskType – список типов задач
Столбец | За что отвечает | Тип данных | Ограничения |
task_type_id | идентификатор типа задачи | int | pk identity(1,1) |
task_type_name | имя типа задачи | varchar(50) | not null |
Будут следующие типы задач:
- Организовать мероприятие
- Подготовить документацию
Employee – список статусов задач
Столбец | За что отвечает | Тип данных | Ограничения |
employee_id | идентификатор сотрудника | int | pk identity(1,1) |
fullname | ФИО | varchar(100) | not null |
birthdate | Дата рождения | date | not null |
Электронная почта | varchar(100) | not null | |
photo | Относительный путь к фото сотрудника | varchar(100) | |
user_login | имя пользователя для входа в приложение | varchar(100) | not null |
user_password | пароль пользователя для входа в приложение | varchar(100) | not null |
role_id | идентификатор роли пользователя | int | fk (Role) not null |
department_id | идентификатор подразделения пользователя | int | foreign key (Department) not null |
Department – список подразделений
Столбец | За что отвечает | Тип данных | Ограничения |
department_id | идентификатор сотрудника | int | pk identity(1,1) |
dep_name | название подразделения | varchar(100) | not null |
dep_head_id | идентификатор главы подразделения | int | fk (Employee) |
Будет всего 2 подразделения:
- Кафедра иронии
- Кафедра постиронии
На каждой кафедре будет создано по 3 пользователя по одному на каждую роль.
Task – список задач сотрудников
Столбец | За что отвечает | Тип данных | Ограничения |
task_id | идентификатор задачи | int | pk identity(1,1) |
task_type_id | идентификатор типа задачи | int | fk (TaskType) not null |
task_status_id | идентификатор статуса задачи | int | fk (TaskStatus) not null |
task_name | имя задачи | varchar(100) | not null |
task_desc | описание задачи | text | |
creation_date | дата и время создания задачи | datetime | not null |
deadline | срок выполнения задачи | datetime | not null |
complete_date | реальная дата и реальное время выполнение задачи | datetime | |
author_id | идентификатор автора | int | fk (Employee) not null |
performer_id | идентификатор ответственного сотрудника | int | fk (Employee) not null |
attachment | Относительный путь к вложению | varchar(100) |
Будет создано несколько задач с разным наполнением.
СОЗДАНИЕ ПРОЕКТА
В приложении будут следующие формы:
1) Форма входа – главная форма приложения (в проекте VisualStudio)
2) Основная форма – это как бы тоже главная форма приложения, но для нас, ибо на ней будут основные действия. Будем называть эту форму главным меню.
3) Добавление пользователя – форма добавления нового пользователя. Доступна только для пользователей с ролью «Админ».
4) Список сотрудников – форма со списком сотрудников.
ПОСЛЕ СОЗДАНИЯ ПРОЕКТА
После создания проекта мы должны скачать EF6.
После установки в правом блоке будет указана установленная версия
Для возможности работы с LINQ нам надо к проекту добавить ссылку на пространство имён, содержащее нужные нам классы.
Для организации работы с вложениями (а точнее – для получения пути, где находится exe-файл программы) мы должны подключить следующее пространство имён
СТРУКТУРА ПРОЕКТА
Она далека от идеала. Реальные приложения строятся несколько иначе.
1. Классы форм – в них мы описываем всё, что связано с вводом/выводом данных на формы, описываем взаимодействие пользователя и формы. В этих классах нет ничего связанного с работой с БД, с реализацией основной логики приложения. Здесь есть разве что логика, связанная с внешним видом. Всё.
2. Класс Logic.cs – реализация основного функционала приложения.
Примеры: вход в приложение, добавление нового пользователя, получение списка сотрудников, списка задач, добавление задачи и т.д.
Методы в этом классе можно разделить на 3 группы: «основные методы» (те, в которых реализована какая-то логика (например, логика регистрации) и «методы, которые нужны для получения чего-то» (например, метод, который получает из БД и возвращает список сотрудников) и «вспомогательные методы» (это такие методы, которые нужны для реализации методов из первых двух групп).
3. Класс-«синглтон» UserData.cs – это публичный класс для хранения некоторой информации о текущем пользователе. Мы не реализовываем многопользовательский режим работы, мы не решаем проблемы параллельной работы с БД и т.д.
Этот класс является «синглтоном». Это означает, что данный класс будет сделан таким образом, что для него в любом случае будет создан только 1 объект. Т.к. мы работаем всегда только через одного пользователя, то нам не нужно создавать больше объектов данного класса. В нём мы будем хранить только данные текущего пользователя.
4. Классы модели данных – это несколько классов для каждой таблицы БД и класс контекста базы данных.
ГЕНЕРАЦИЯ МОДЕЛИ ДАННЫХ
Под генерацией модели данных в приложении понимается создание классов-сущностей (классы для таблиц в БД), создание EDMX-диаграммы (это диаграмма базы данных в Visual Studio), создание класса контекста базы данных (о нём позже).
Так как мы используем ORM-модель, то в приложении будут созданы классы, которые ассоциируются с реальными таблицами в базе данных.
Каждый такой класс будет сопоставляться с таблицей в БД.
Например, класс Employee будет сопоставлен с таблицей Employee.
В этих классах будут созданы переменные, которые в свою очередь будут сопоставляться со столбцами таблиц.
Например, поле employee_id класса Employee будет сопоставлено с одноимённым столбцом таблицы Employee.
Такие классы называются классами-сущностями по понятным причинам.
Классы сущности можно написать самостоятельно. Но их можно и сгенерировать с помощью инструментов Visual Studio и SQL Server, если у нас уже есть база данных. А она у нас уже есть. Далее рассмотрена генерация таких классов.
После этого запустится процесс создания модели. Придётся немного подождать.
Зато после этого в самой VisualStudio будет такая красота.
КЛАССЫ-СУЩНОСТИ
Пример кода класса-сущности «Роль»:
Помимо выделенных полей класса, относящихся к столбцам таблицы «Роль», в классе есть и другие поля. Сейчас о них рассказ вестись не будет. В принципе можно сгенерировать все эти классы и «забыть». Но для более детального углубления в работу ORM-модели можно изучить эту технологию и используемый фреймворк Entity Framework 6.
Ещё раз.
«ГЛАВНЫЙ» КЛАСС МОДЕЛИ
В структуре проекта создан также класс контекста базы данных. Он называется Diana_dbEntities.
С помощью этого класса мы подключаемся к базе данных. С помощью этого класса мы обращаемся к классам-сущностям. С помощью этого класса мы выполняем SQL-запросы.
Можно заметить, что в классе есть виртуальные методы.
Подробно о них можно почитать здесь: https://metanit.com/sharp/tutorial/3.19.php
КАК ПРОИСХОДИТ ПОДКЛЮЧЕНИЕ К БД?
Подключение к базе данных осуществляется через так называемую строку подключения.
После генерации классов-сущностей можно найти в файле App.config (это файл с настройками проекта) следующую запись:
Здесь указывается строка подключения к БД. Она может выглядеть проще. В первом примере приложения как раз это показано. Можно и сюда такую же вставить. Но обычно то, что мы генерируем – выглядит немного сложнее, нежели то, что пишем самостоятельно.
Само подключение к БД осуществляется через класс контекста БД.
Во многих методах класса Logic.cs можно увидеть такую запись:
Переменная context – это экземпляр класса контекста БД. Она хранит свойства соединения с БД. Через неё мы работаем с таблицами. Выполняем SQL-команды.
Код многих методов заключён в скобки внутри блока USING.
Этот блок нужен для того, чтобы объект context, создаваемый в скобках, удалялся, когда работа с ним завершается.
Подробнее про using можно почитать тут: https://metanit.com/sharp/tutorial/8.5.php
ОПИСАНИЕ РЕАЛИЗАЦИИ
1. Вход пользователя
Схематичное описание алгоритма входа
Форма входа выглядит так:
После нажатия на кнопку «Вход» вызывается метод enterUser(string login, string password) – в этом методе реализована нарисованная выше логика. Но только при успешном входе метод возвращает true, а при неудачном – false.
Запросы мы пишем вот так:
Для написания запросов используется «технология», которая называется LINQ – это так называемый язык запросов к разным источникам данных. В том числе и к SQL-базам данных.
Подробнее про LINQ можно почитать здесь: https://metanit.com/sharp/tutorial/15.1.php
Сравнение обычного SQL-запроса и LINQ – запроса: