Доброго времени суток! В данной статье мы рассмотрим один из способ подключения и получения
данных из MySQL на C#.
Предполагается, что у Вас уже установлена и настроена одна из сред разработки для C#, будь-то
Visual Studio, JetBrains Rider или VSCode c плагинами. Поэтому данный вопрос не рассматривается.
Итак, для работы с MySQL из C# нам нужна дополнительная библиотека под названием Pomelo.EntityFrameworkcore.Mysql,
которая до безобразия просто устанавливается из репозитория пакетов Nuget.
После установки пакетов приступим к написанию кода.
Базовый класс отвечающий за установку и настройку соединения с базой данных
using Microsoft.EntityFrameworkCore;
namespace Net6MySQL
{
public sealed class ApplicationContext : DbContext
{
// все пользователи будут извлекаться через это свойство
public DbSet<User>? Users { get; set; }
public ApplicationContext()
{
Database.EnsureCreated();
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
// настройка подключения к базе данных
optionsBuilder.UseMySql(
"server=localhost;user=user1;password=pasword1;database=magazin;",
new MySqlServerVersion(new Version(8, 0, 22))
);
}
}
}
Класс User.cs — описывает наш модель — пользователя
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
namespace Net6MySQL
{
// указываем название нашей таблицы в базе
[Table("users_table")]
// данный атрибут говорит, что у таблицы нет поля Id (в данном случае) - инкрементального идентификатора
[Keyless]
public class User
{
// описываем поля таблицы
public string? SSN { get; set; }
public string? Name { get; set; }
public string? Birth { get; set; }
public string? Country { get; set; }
public string? City { get; set; }
public string? Street { get; set; }
public string? House { get; set; }
public string? Flat { get; set; }
public override string ToString()
{
return $"{nameof(SSN)}: {SSN}, {nameof(Name)}: {Name}, {nameof(Birth)}: {Birth}, {nameof(Country)}: {Country}, " +
$"{nameof(City)}: {City}, {nameof(Street)}: {Street}, {nameof(House)}: {House}, {nameof(Flat)}: {Flat}";
}
}
}
Класс UserRepository — отвечает за извлечение информации из базы данных и ее сохранения
using Microsoft.EntityFrameworkCore;
namespace Net6MySQL
{
public class UserRepository
{
private readonly ApplicationContext _dbContext;
// принимает ранее созданный и настроенный контекст базы данных
public UserRepository(ApplicationContext dbContext)
{
_dbContext = dbContext;
}
// извлекает всех пользователей из базы данных
public List<User>? GetUsers()
{
return _dbContext.Users?.ToList();
}
// возвращает пользователя по его SSN
public User? GetUserBySSN(string ssn)
{
return _dbContext.Users?.FirstOrDefault(user => user.SSN != null && user.SSN.Contains(ssn));
}
// поиск пользователя по имени
public List<User>? GetUsersByName(string name)
{
return _dbContext.Users?.Where(user => user.Name != null && EF.Functions.Like(user.Name, $"%{name}%")).ToList();
}
}
}
Файл Program.cs — непосредственно использует ранее определенные классы
namespace Net6MySQL
{
public static class Program
{
public static void Main(string[] args)
{
// получаем подключение к БД MySQL
using var db = new ApplicationContext();
// создаем репозиторий пользователя
var repo = new UserRepository(db);
// извлекаем пользователя
var user = repo.GetUserBySSN("0000000000");
if(user != null) Console.WriteLine(user);
var users1 = repo.GetUsersByName("Doe");
if (users1 == null) return;
foreach (var user1 in users1)
{
Console.WriteLine(user1);
}
}
}
}
Таким образом, мы получаем данные о пользователях из базы данных не написав не единой строчки SQL кода.
В этом и состоит главное преимущество подобного подхода с использованием EntityFramework —
строки из таблиц базы данных преобразуются фреймворком в объекты языка, с которыми мы уже работаем как обычно.