Установка
1dotnet add package Microsoft.EntityFrameworkCore.SqlServer2dotnet add package Microsoft.EntityFrameworkCore.Tools3dotnet add package Microsoft.EntityFrameworkCore.Design
Модели данных
1public class Blog2{3 public int Id { get; set; }4 public string Title { get; set; } = string.Empty;5 public string Content { get; set; } = string.Empty;6 public DateTime CreatedAt { get; set; } = DateTime.UtcNow;78 public ICollection<Post> Posts { get; set; } = new List<Post>();9}1011public class Post12{13 public int Id { get; set; }14 public string Title { get; set; } = string.Empty;15 public string Content { get; set; } = string.Empty;1617 public int BlogId { get; set; }18 public Blog Blog { get; set; } = null!;1920 public ICollection<Comment> Comments { get; set; } = new List<Comment>();21}2223public class Comment24{25 public int Id { get; set; }26 public string Author { get; set; } = string.Empty;27 public string Text { get; set; } = string.Empty;2829 public int PostId { get; set; }30 public Post Post { get; set; } = null!;31}
DbContext
1public class AppDbContext : DbContext2{3 public DbSet<Blog> Blogs => Set<Blog>();4 public DbSet<Post> Posts => Set<Post>();5 public DbSet<Comment> Comments => Set<Comment>();67 public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }89 protected override void OnModelCreating(ModelBuilder modelBuilder)10 {11 modelBuilder.Entity<Blog>(entity =>12 {13 entity.HasKey(e => e.Id);14 entity.Property(e => e.Title).IsRequired().HasMaxLength(200);15 entity.HasMany(e => e.Posts)16 .WithOne(e => e.Blog)17 .HasForeignKey(e => e.BlogId);18 });1920 modelBuilder.Entity<Post>(entity =>21 {22 entity.HasKey(e => e.Id);23 entity.HasMany(e => e.Comments)24 .WithOne(e => e.Post)25 .HasForeignKey(e => e.PostId);26 });27 }28}
CRUD операции
1// Создание2var blog = new Blog { Title = "My Blog" };3context.Blogs.Add(blog);4await context.SaveChangesAsync();56// Чтение с Include7var blogs = await context.Blogs8 .Include(b => b.Posts)9 .ThenInclude(p => p.Comments)10 .Where(b => b.Title.Contains("My"))11 .OrderByDescending(b => b.CreatedAt)12 .ToListAsync();1314// Обновление15var blogToUpdate = await context.Blogs.FindAsync(1);16if (blogToUpdate is not null)17{18 blogToUpdate.Title = "Updated Title";19 await context.SaveChangesAsync();20}2122// Удаление23context.Blogs.Remove(blogToUpdate!);24await context.SaveChangesAsync();
Миграции
1# Создание миграции2dotnet ef migrations add InitialCreate34# Применение миграций5dotnet ef database update67# Откат миграции8dotnet ef database update PreviousMigration910# Генерация скрипта11dotnet ef migrations script
Оптимизация запросов
▸AsNoTracking
1// Для read-only запросов2var blogs = await context.Blogs3 .AsNoTracking()4 .Where(b => b.Title.Contains("My"))5 .ToListAsync();
▸Проекция
1var blogDtos = await context.Blogs2 .Select(b => new BlogDto3 {4 Id = b.Id,5 Title = b.Title,6 PostCount = b.Posts.Count7 })8 .ToListAsync();
Заключение
Entity Framework Core — это мощный ORM для .NET, упрощающий работу с базами данных. Миграции, LINQ-запросы и оптимизации позволяют создавать производительные приложения с минимальным количеством бойлерплейта.