Лабораторная работа 4. Работа с БД
В работе нужно создать консольную программу на C#, которая умеет хранить пользователей в базе данных.
Пользователь будет иметь:
Id
Name
Age
Программа должна уметь:
1. Добавлять пользователя
2. Показывать всех пользователей
3. Искать пользователя
4. Изменять данные пользователя
5. Удалять пользователя
2. Что такое SQLite
SQLite — это база данных в виде обычного файла.
Например:
lab.db
Этот файл создаётся рядом с программой.
Внутри него хранятся таблицы и данные.
То есть SQLite не требует отдельного сервера. Это удобно для учебных проектов.
3. Что такое Entity Framework Core
Entity Framework Core — это инструмент, который позволяет работать с базой данных через обычные C# классы.
Нам не нужно писать команды для базы вручную.
Вместо этого нужно писать:
db.Users.Add(user);
db.SaveChanges();
А Entity Framework сам понимает, что нужно сохранить пользователя в базу.
4. Главная идея лабораторной работы
В этой работе важно понять связь:
Класс C# → Таблица в базе данных
Объект C# → Строка в таблице
Свойство класса → Колонка в таблице
Пример:
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public string Email { get; set; }
}
Это означает, что в базе будет таблица пользователей.
Примерно так:
| Id | Name | Age | |
|---|---|---|---|
| 1 | Ivan | 25 | ivan@mail.com |
| 2 | Anna | 30 | anna@mail.com |
5. Создание проекта в Visual Studio
Шаг 1
Открыть Visual Studio.
Шаг 2
Нажать:
Create a new project
Шаг 3
Выбрать:
Console App
Шаг 4
Назвать проект, например:
SQLiteEfLab
Шаг 5
Нажать Create.
6. Установка нужных пакетов
Чтобы C# мог работать с SQLite через Entity Framework, нужно установить NuGet-пакеты.
В Visual Studio:
Project → Manage NuGet Packages
Во вкладке Browse установить:
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.Sqlite
Microsoft.EntityFrameworkCore.Tools
7. Создание модели User
Создать файл:
User.cs
Вставить код:
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public string Email { get; set; }
}
Объяснение
User — это пользователь.
Id — уникальный номер пользователя.
Name — имя.
Age — возраст.
Email — электронная почта
8. Создание контекста базы данных
Создать файл:
AppDbContext.cs
Вставить код:
using Microsoft.EntityFrameworkCore;
public class AppDbContext : DbContext
{
public DbSet<User> Users { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder options)
{
options.UseSqlite("Data Source=lab.db");
}
}
Объяснение
AppDbContext — это главный класс для работы с базой.
Он управляет подключением, таблицами и сохранением данных.
public DbSet<User> Users { get; set; }
означает:
В базе данных будет набор пользователей.
UseSqlite("Data Source=lab.db") означает:
Использовать SQLite-файл lab.db.
9. Создание базы данных
В файле Program.cs написать:
using System;
using System.Linq;
class Program
{
static void Main()
{
using var db = new AppDbContext();
db.Database.EnsureCreated();
Console.WriteLine("База данных создана или уже существует.");
}
}
Объяснение
using var db = new AppDbContext();
создаёт подключение к базе данных.
db.Database.EnsureCreated();
создаёт файл базы данных и таблицы, если их ещё нет.
После запуска появится файл:
lab.db
10. Добавление пользователя
Добавим в Main:
var user = new User
{
Name = "Ivan",
Age = 25,
Email = "ivan@mail.com"
};
db.Users.Add(user);
db.SaveChanges();
Console.WriteLine("Пользователь добавлен.");
Полный код на этом этапе
using System;
using System.Linq;
class Program
{
static void Main()
{
using var db = new AppDbContext();
db.Database.EnsureCreated();
var user = new User
{
Name = "Ivan",
Age = 25,
Email = "ivan@mail.com"
};
db.Users.Add(user);
db.SaveChanges();
Console.WriteLine("Пользователь добавлен.");
}
}
Объяснение
new User
создаёт нового пользователя в памяти программы.
db.Users.Add(user);
говорит Entity Framework:
Этого пользователя нужно добавить в базу.
db.SaveChanges();
сохраняет изменения в файл базы данных.
Без SaveChanges() данные не сохранятся.
11. Вывод всех пользователей
Добавим код:
var users = db.Users.ToList();
foreach (var u in users)
{
Console.WriteLine($"{u.Id} | {u.Name} | {u.Age} | {u.Email}");
}
Объяснение
db.Users.ToList()
получает всех пользователей из базы.
foreach
перебирает пользователей по одному и выводит их в консоль.
12. Поиск пользователя
Например, нужно найти пользователей, у которых в имени есть Iv.
var foundUsers = db.Users
.Where(u => u.Name.Contains("Iv"))
.ToList();
foreach (var u in foundUsers)
{
Console.WriteLine($"{u.Id} | {u.Name} | {u.Age} | {u.Email}");
}
Объяснение
Where
означает “отфильтровать”.
u.Name.Contains("Iv")
означает:
в имени пользователя есть текст Iv
13. Сортировка пользователей
Например, вывести пользователей по возрасту:
var sortedUsers = db.Users
.OrderBy(u => u.Age)
.ToList();
foreach (var u in sortedUsers)
{
Console.WriteLine($"{u.Id} | {u.Name} | {u.Age} | {u.Email}");
}
Объяснение
OrderBy(u => u.Age)
сортирует пользователей по возрасту от меньшего к большему.
Для сортировки от большего к меньшему:
OrderByDescending(u => u.Age)
14. Изменение пользователя
Например, нужно изменить пользователя с Id = 1.
var user = db.Users.FirstOrDefault(u => u.Id == 1);
if (user != null)
{
user.Name = "Ivan Updated";
user.Age = 26;
user.Email = "new_ivan@mail.com";
db.SaveChanges();
Console.WriteLine("Пользователь обновлён.");
}
else
{
Console.WriteLine("Пользователь не найден.");
}
Объяснение
FirstOrDefault(u => u.Id == 1)
ищет первого пользователя с номером 1.
Если пользователь найден, мы меняем его свойства:
user.Name = "Ivan Updated";
А потом обязательно вызываем:
db.SaveChanges();
15. Удаление пользователя
var user = db.Users.FirstOrDefault(u => u.Id == 1);
if (user != null)
{
db.Users.Remove(user);
db.SaveChanges();
Console.WriteLine("Пользователь удалён.");
}
else
{
Console.WriteLine("Пользователь не найден.");
}
Объяснение
Remove(user)
помечает пользователя на удаление.
SaveChanges()
окончательно удаляет его из базы.
16. Полный пример программы
User.cs
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public string Email { get; set; }
}
AppDbContext.cs
using Microsoft.EntityFrameworkCore;
public class AppDbContext : DbContext
{
public DbSet<User> Users { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder options)
{
options.UseSqlite("Data Source=lab.db");
}
}
Program.cs
using System;
using System.Linq;
class Program
{
static void Main()
{
using var db = new AppDbContext();
db.Database.EnsureCreated();
while (true)
{
Console.WriteLine();
Console.WriteLine("1 - Добавить пользователя");
Console.WriteLine("2 - Показать всех пользователей");
Console.WriteLine("3 - Найти пользователя по имени");
Console.WriteLine("4 - Обновить пользователя");
Console.WriteLine("5 - Удалить пользователя");
Console.WriteLine("6 - Показать пользователей по возрасту");
Console.WriteLine("0 - Выход");
Console.Write("Выберите действие: ");
string choice = Console.ReadLine();
if (choice == "1")
{
AddUser(db);
}
else if (choice == "2")
{
ShowUsers(db);
}
else if (choice == "3")
{
FindUser(db);
}
else if (choice == "4")
{
UpdateUser(db);
}
else if (choice == "5")
{
DeleteUser(db);
}
else if (choice == "6")
{
ShowUsersSortedByAge(db);
}
else if (choice == "0")
{
break;
}
else
{
Console.WriteLine("Неверный пункт меню.");
}
}
}
static void AddUser(AppDbContext db)
{
Console.Write("Введите имя: ");
string name = Console.ReadLine();
Console.Write("Введите возраст: ");
string ageText = Console.ReadLine();
if (!int.TryParse(ageText, out int age))
{
Console.WriteLine("Возраст должен быть числом.");
return;
}
Console.Write("Введите Email: ");
string email = Console.ReadLine();
var user = new User
{
Name = name,
Age = age,
Email = email
};
db.Users.Add(user);
db.SaveChanges();
Console.WriteLine("Пользователь добавлен.");
}
static void ShowUsers(AppDbContext db)
{
var users = db.Users.ToList();
if (users.Count == 0)
{
Console.WriteLine("Пользователей пока нет.");
return;
}
foreach (var u in users)
{
Console.WriteLine($"{u.Id} | {u.Name} | {u.Age} | {u.Email}");
}
}
static void FindUser(AppDbContext db)
{
Console.Write("Введите часть имени: ");
string name = Console.ReadLine();
var users = db.Users
.Where(u => u.Name.Contains(name))
.ToList();
if (users.Count == 0)
{
Console.WriteLine("Пользователи не найдены.");
return;
}
foreach (var u in users)
{
Console.WriteLine($"{u.Id} | {u.Name} | {u.Age} | {u.Email}");
}
}
static void UpdateUser(AppDbContext db)
{
Console.Write("Введите Id пользователя: ");
string idText = Console.ReadLine();
if (!int.TryParse(idText, out int id))
{
Console.WriteLine("Id должен быть числом.");
return;
}
var user = db.Users.FirstOrDefault(u => u.Id == id);
if (user == null)
{
Console.WriteLine("Пользователь не найден.");
return;
}
Console.Write("Введите новое имя: ");
user.Name = Console.ReadLine();
Console.Write("Введите новый возраст: ");
string ageText = Console.ReadLine();
if (!int.TryParse(ageText, out int age))
{
Console.WriteLine("Возраст должен быть числом.");
return;
}
user.Age = age;
Console.Write("Введите новый Email: ");
user.Email = Console.ReadLine();
db.SaveChanges();
Console.WriteLine("Пользователь обновлён.");
}
static void DeleteUser(AppDbContext db)
{
Console.Write("Введите Id пользователя: ");
string idText = Console.ReadLine();
if (!int.TryParse(idText, out int id))
{
Console.WriteLine("Id должен быть числом.");
return;
}
var user = db.Users.FirstOrDefault(u => u.Id == id);
if (user == null)
{
Console.WriteLine("Пользователь не найден.");
return;
}
db.Users.Remove(user);
db.SaveChanges();
Console.WriteLine("Пользователь удалён.");
}
static void ShowUsersSortedByAge(AppDbContext db)
{
var users = db.Users
.OrderBy(u => u.Age)
.ToList();
foreach (var u in users)
{
Console.WriteLine($"{u.Id} | {u.Name} | {u.Age} | {u.Email}");
}
}
}
Нужно понимать:1. База данных нужна для хранения информации после закрытия программы.
2. SQLite хранит базу в одном файле.
3. Entity Framework позволяет работать с базой без SQL.
4. Класс User превращается в таблицу пользователей.
5. Объект User превращается в одну запись в таблице.
6. SaveChanges() обязательно сохраняет изменения.
7. Через Add, Remove, Where, OrderBy можно управлять данными.
18. Задания для самостоятельной работы
Базовый уровень
- Создать проект в Visual Studio.
- Установить Entity Framework Core.
- Создать класс
User. - Создать
AppDbContext. - Реализовать добавление пользователя.
- Реализовать вывод всех пользователей.
- Добавить поле
Email. - Реализовать поиск пользователя по имени.
- Реализовать сортировку пользователей по возрасту.
- Реализовать изменение данных пользователя.
- Реализовать удаление пользователя.
Частые ошибки
Ошибка 1. Данные не сохраняются
Причина:
db.SaveChanges();
не был вызван.
Ошибка 2. Не установлены пакеты
Если Visual Studio подчёркивает DbContext или UseSqlite, значит не установлены нужные NuGet-пакеты.
Ошибка 3. Возраст вводится текстом
Например, пользователь ввёл:
abc
Поэтому нужно использовать:
int.TryParse(...)
Ошибка 4. Пользователь не найден
FirstOrDefault может вернуть null.
Поэтому нужна проверка:
if (user == null)