Простое введение в 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. Если у вас есть какие-либо вопросы или комментарии о том, как улучшить эту статью, сообщите мне об этом в разделе комментариев.