Работа с MySQL .Net EntityFramework

Доброго времени суток! В данной статье мы рассмотрим один из способ подключения и получения
данных из 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
строки из таблиц базы данных преобразуются фреймворком в объекты языка, с которыми мы уже работаем как обычно.

Источник