Основные операции с данными. CRUD
Большинство операций с данными так или иначе представляют собой CRUD операции (Create, Read, Update, Delete), то есть создание, получение, обновление и удаление. Entity Framework Core позволяет легко выполнять все эти действия.
Для примера создадим проект по типу Console App (.NET Core). И после создания проекта сразу добавим в него функциональность EF Core. Для этого в проект через NuGet пакет Microsoft.EntityFrameworkCore.SqlServer.
Затем добавим в проект класс User, объекты которого будут храниться в базе данных:
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
И добавим класс контекста данных ApplicationContext:
using Microsoft.EntityFrameworkCore;
namespace HelloApp
{
public class ApplicationContext : DbContext
{
public DbSet<User> Users { get; set; }
public ApplicationContext()
{
Database.EnsureCreated();
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=helloappdb;Trusted_Connection=True;");
}
}
}
Далее определим в классе Program все базовые операции с данными:
using System;
using System.Linq;
namespace HelloApp
{
public class Program
{
public static void Main(string[] args)
{
// Добавление
using (ApplicationContext db = new ApplicationContext())
{
User user1 = new User { Name = "Tom", Age = 33 };
User user2 = new User { Name = "Alice", Age = 26 };
// Добавление
db.Users.Add(user1);
db.Users.Add(user2);
db.SaveChanges();
}
// получение
using (ApplicationContext db = new ApplicationContext())
{
// получаем объекты из бд и выводим на консоль
var users = db.Users.ToList();
Console.WriteLine("Данные после добавления:");
foreach (User u in users)
{
Console.WriteLine($"{u.Id}.{u.Name} - {u.Age}");
}
}
// Редактирование
using (ApplicationContext db = new ApplicationContext())
{
// получаем первый объект
User user = db.Users.FirstOrDefault();
if(user!=null)
{
user.Name = "Bob";
user.Age = 44;
//обновляем объект
//db.Users.Update(user);
db.SaveChanges();
}
// выводим данные после обновления
Console.WriteLine("\nДанные после редактирования:");
var users = db.Users.ToList();
foreach (User u in users)
{
Console.WriteLine($"{u.Id}.{u.Name} - {u.Age}");
}
}
// Удаление
using (ApplicationContext db = new ApplicationContext())
{
// получаем первый объект
User user = db.Users.FirstOrDefault();
if (user != null)
{
//удаляем объект
db.Users.Remove(user);
db.SaveChanges();
}
// выводим данные после обновления
Console.WriteLine("\nДанные после удаления:");
var users = db.Users.ToList();
foreach (User u in users)
{
Console.WriteLine($"{u.Id}.{u.Name} - {u.Age}");
}
}
Console.Read();
}
}
}
И после выполнения мы получим следующий консольный вывод:
Данные после добавления 1.Tom - 33 2.Alice - 26 Данные после редактирования 1.Bob - 44 2.Alice - 26 Данные после удаления 2.Alice - 26
Добавление
Для добавления объекта используется метод Add, определенный у класса DbSet, в который передается добавляемый объект:
db.Users.Add(user2);
db.SaveChanges();
Метод Add устанавливает значение Added в качестве состояния нового объекта. Поэтому метод db.SaveChanges() сгенерирует выражение INSERT для вставки модели в таблицу.
Если нам надо добавить сразу несколько объектов, то мы можем воспользоваться методом AddRange():
User user1 = new User { Name = "Tom", Age = 33 };
User user2 = new User { Name = "Alice", Age = 26 };
db.Users.AddRange(user1, user2);
Удаление
Удаление производится с помощью метода Remove:
db.Users.Remove(user);
db.SaveChanges();
Данный метод установит статус объекта в Deleted, благодаря чему Entity Framework при выполнении метода db.SaveChanges() сгенерирует SQL-выражение DELETE.
Если необходимо удалить сразу несколько объектов, то можно использовать метод RemoveRange():
User user1 = db.Users.FirstOrDefault();
User user2 = db.Users.LastOrDefault();
db.Users.RemoveRange(user1, user2);
Редактирование
При изменении объекта Entity Framework сам отслеживает все изменения, и когда вызывается метод SaveChanges(), будет сформировано SQL-выражение UPDATE для данного объекта, которое обновит объект в базе данных.
Но надо отметить, что в данном случае действие контекста данных ограничивается пределами конструкции using. Но рассмотрим другой пример. Мы получаем объект в одном месте, а обновляем в другом. Например:
User user = null;
using (ApplicationContext db = new ApplicationContext())
{
// получаем объект
user = db.Users.FirstOrDefault();
Console.WriteLine("Данные до редактирования:");
var users = db.Users.ToList();
foreach (User u in users)
{
Console.WriteLine($"{u.Id}.{u.Name} - {u.Age}");
}
}
//...................
// Редактирование
using (ApplicationContext db = new ApplicationContext())
{
// Редактирование
if (user != null)
{
user.Name = "Sam";
user.Age = 33;
}
db.SaveChanges();
// выводим данные после обновления
Console.WriteLine("\nДанные после редактирования:");
var users = db.Users.ToList();
foreach (var u in users)
{
Console.WriteLine($"{u.Id}.{u.Name} - {u.Age}");
}
}
Несмотря на то, что объект user не равен null, имеется в базе данных, но во втором блоке using обновления соответствующего объекта в БД не произойдет. И в этом случае нам надо использовать метод Update:
// Редактирование
using (ApplicationContext db = new ApplicationContext())
{
// Редактирование
if (user != null)
{
user.Name = "Sam";
user.Age = 33;
db.Users.Update(user);
}
db.SaveChanges();
// выводим данные после обновления
Console.WriteLine("\nДанные после редактирования:");
var users = db.Users.ToList();
foreach (var u in users)
{
Console.WriteLine($"{u.Id}.{u.Name} - {u.Age}");
}
}
При необходимости обновить одновременно несколько объектов, применяется метод UpdateRange():
db.Users.UpdateRange(user1, user2);
Только полноправные пользователи могут оставлять комментарии. Аутентифицируйтесь пожалуйста, используя сервисы.