Простое введение в ADO.NET и Entity Framework с примерами

CRUD означает создание, чтение, обновление и удаление и представляет собой четыре основные операции, которые можно выполнять с данными в базе данных. Эти операции обычно реализуются в приложениях, управляемых базой данных, чтобы пользователи могли создавать, читать, обновлять и удалять записи в базе данных.

В приложении .NET операции CRUD могут быть реализованы с использованием различных технологий и подходов, таких как ADO.NET, Entity Framework или LINQ to SQL.

АДО.НЕТ

ADO.NET — это набор технологий доступа к данным от Microsoft, которые позволяют разработчикам получать доступ и управлять данными из различных источников в приложении .NET. Это комплексная платформа доступа к данным, которая обеспечивает согласованную модель программирования для доступа к данным из различных источников данных, включая реляционные базы данных, XML-файлы и данные в памяти.

ADO.NET состоит из набора классов, которые используются для подключения к базе данных, выполнения команд и получения результатов. Он также включает набор поставщиков доступа к данным, которые позволяют разработчикам получать доступ к различным типам источников данных, таким как SQL Server, Oracle и OLEDB.

ADO.NET предоставляет высокопроизводительное и масштабируемое решение для доступа к данным для приложений .NET. Он разработан, чтобы быть легким и простым в использовании, с простой и интуитивно понятной моделью программирования. С помощью ADO.NET разработчики могут легко получать доступ к данным и управлять ими в различных сценариях, включая веб-приложения, настольные приложения и мобильные устройства.

Вот пример службы, реализующей операции CRUD для базы данных SQL с использованием ADO.NET:

using System;
using System.Data;
using System.Data.SqlClient;

namespace CrudExample;

public class AdoNetCrudService
{
    private const string ConnectionString = "YOUR_CONNECTION_STRING_HERE";

    public void Create(string name, int age)
    {
        using var connection = new SqlConnection(ConnectionString);
        connection.Open();

        var command = new SqlCommand("INSERT INTO TableName (Name, Age) VALUES (@name, @age)", connection);
        command.Parameters.AddWithValue("@name", name);
        command.Parameters.AddWithValue("@age", age);

        command.ExecuteNonQuery();
    }

    public DataTable Read()
    {
        using var connection = new SqlConnection(ConnectionString);
        connection.Open();

        var command = new SqlCommand("SELECT * FROM TableName", connection);

        SqlDataReader reader = command.ExecuteReader();
        var dataTable = new DataTable();
        dataTable.Load(reader);

        return dataTable;
    }

    public void Update(int id, string name, int age)
    {
        using var connection = new SqlConnection(ConnectionString);
        connection.Open();

        var command = new SqlCommand("UPDATE TableName SET Name = @name, Age = @age WHERE Id = @id", connection);
        command.Parameters.AddWithValue("@id", id);
        command.Parameters.AddWithValue("@name", name);
        command.Parameters.AddWithValue("@age", age);

        command.ExecuteNonQuery();
    }

    public void Delete(int id)
    {
        using var connection = new SqlConnection(ConnectionString);
        connection.Open();

        var command = new SqlCommand("DELETE FROM TableName WHERE Id = @id", connection);
        command.Parameters.AddWithValue("@id", id);

        command.ExecuteNonQuery();
    }
}

В этом примере метод AdoNetCrudService.Create вставляет новую строку в таблицу TableName с указанными значениями name и age. Метод AdoNetCrudService.Read извлекает все строки из таблицы TableName и возвращает их в файле DataTable. Метод AdoNetCrudService.Update обновляет строку с указанным id, устанавливая значения name и age в указанные значения. Наконец, метод AdoNetCrudService.Delete удаляет строку с указанным id.

Обратите внимание, что эти методы используют параметризованные SQL-запросы для предотвращения атак путем внедрения SQL-кода. Важно всегда использовать параметризованные запросы, чтобы защитить базу данных от злонамеренного ввода.

Структура сущности

Entity Framework (EF) — это объектно-реляционный преобразователь (ORM), который позволяет разработчикам работать с базой данных, используя объекты .NET. Это технология доступа к данным, которая обеспечивает абстракцию более высокого уровня по сравнению с ADO.NET, позволяя разработчикам сосредоточиться на бизнес-логике своего приложения, а не на деталях того, как получить доступ к данным в базе данных и управлять ими.

В отличие от ADO.NET, который требует от разработчиков написания необработанных SQL-запросов и обработки низкоуровневых деталей доступа к данным, EF предоставляет набор API-интерфейсов, которые позволяют разработчикам работать с данными более интуитивно и объектно-ориентированным способом. EF создает сопоставление между схемой базы данных и объектами .NET, позволяя разработчикам запрашивать данные и управлять ими с помощью LINQ (Language Integrated Query) и объектов .NET.

EF предлагает несколько преимуществ по сравнению с ADO.NET, например:

  • Упрощенный доступ к данным: с помощью EF разработчики могут работать с данными, используя объекты .NET и LINQ, а не писать необработанные SQL-запросы. Это может упростить доступ к данным в базе данных и управление ими, особенно для разработчиков, которые лучше знакомы с программированием .NET, чем с SQL.
  • Улучшенная ремонтопригодность: поскольку EF абстрагирует детали доступа к данным и управления ими, он может упростить изменение базовой схемы базы данных или логики доступа к данным, не затрагивая остальную часть приложения.
  • Повышение производительности: EF включает такие функции, как отложенная загрузка и кэширование объектов, которые могут помочь повысить производительность приложения.
  • Поддержка нескольких баз данных: EF поддерживает несколько ядер баз данных, включая SQL Server, Oracle, MySQL и другие. Это упрощает переключение между разными базами данных или поддержку нескольких баз данных в одном приложении.

Вот пример службы, реализующей операции CRUD с использованием Entity Framework. Сначала мы создаем сущность, которая будет храниться в базе данных SQL:

public class BaseEntity<T>
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public T Id { get; set; } = default!;
}

public class Customer : BaseEntity<string>
{

    public string Name { get; set; } = null!;
    public int Age { get; set; }
}

Затем мы должны определить контекст базы данных:

public class CustomerDbContext : DbContext
{
    public CustomerDbContext(DbContextOptions<CustomerDbContext> dbContextOptions) : base(dbContextOptions)
    {
    }

    public DbSet<Customer> Customer { get; set; } = null!;
}

Из приведенной выше реализации видно, что мы должны предоставить параметры для контекста базы данных. Это можно сделать с помощью фабрики параметров контекста базы данных:

public static class DbContextOptionsFactory
{
    public static Action<DbContextOptionsBuilder> Create(string connectionString)
    {
        return options =>
        {
            _ = options.UseLazyLoadingProxies();
            _ = options.UseSqlServer(connectionString);
        };
    }
}

Теперь у нас есть все предварительные работы. Вот реализация службы CRUD в Entity Framework:

using System.Linq;
using Microsoft.EntityFrameworkCore;

public class EntityFrameworkCrudService
{
    private readonly CustomerDbContext _dbContext;

    public CrudService(CustomerDbContext dbContext)
    {
        _dbContext = dbContext;
    }

    public void Create(string name, int age)
    {
        _dbContext.Customer.Add(new Customer
        {
            Name = name,
            Age = age
        });
        _dbContext.SaveChanges();
    }

    public IQueryable<Customer> Read()
    {
        return _dbContext.Customer;
    }

    public void Update(int id, string name, int age)
    {
        var tableName = _dbContext.Customer.Find(id);
        if (tableName != null)
        {
            tableName.Name = name;
            tableName.Age = age;
            _dbContext.SaveChanges();
        }
    }

    public void Delete(int id)
    {
        var tableName = _dbContext.Customer.Find(id);
        if (tableName != null)
        {
            _dbContext.Customer.Remove(tableName);
            _dbContext.SaveChanges();
        }
    }
}

В этом примере метод EntityFrameworkCrudService.Create создает новый объект Customer и добавляет его в набор Customer в файле DbContext. Метод EntityFrameworkCrudService.Read возвращает набор Customer в виде объекта IQueryable, что позволяет разработчикам легко фильтровать и сортировать данные. Метод EntityFrameworkCrudService.Update извлекает объект Customer с указанным id из DbContext, обновляет его свойства и сохраняет изменения в базе данных. Наконец, метод EntityFrameworkCrudService.Delete удаляет объект Customer с указанным id из DbContext и сохраняет изменения в базе данных.

В целом Entity Framework — это мощная и гибкая технология доступа к данным, которая может упростить разработчикам создание приложений, управляемых данными, с помощью .NET. Однако важно отметить, что EF не может быть лучшим выбором во всех сценариях, а ADO.NET все же может быть лучшим вариантом в некоторых случаях, например, когда вам нужен более детальный контроль над логикой доступа к данным или когда вы работаете с базой данных, которая не поддерживается EF.

Я надеюсь, что эта статья помогла вам получить представление о двух популярных платформах для взаимодействия с базами данных в приложениях .NET: ADO.NET и Entity Framework. Если у вас есть какие-либо вопросы или комментарии о том, как улучшить эту статью, сообщите мне об этом в разделе комментариев.