Entity Framework Core (EF Core) — это облегченная кроссплатформенная платформа объектно-реляционного сопоставления (ORM). EF Core предоставляет набор расширенных функций, которые помогут вам повысить производительность, масштабируемость и функциональность ваших приложений. Вот некоторые из этих расширенных функций:
- Необработанные SQL-запросы. EF Core позволяет выполнять необработанные SQL-запросы к базе данных. Это может быть полезно, когда вам нужно выполнить сложные запросы или оптимизировать производительность.
- Отслеживание изменений. EF Core отслеживает изменения, внесенные в объекты сущностей, и соответствующим образом обновляет базу данных. Вы также можете настроить поведение отслеживания изменений с помощью свойства DbContext.ChangeTracker.
- Перехват запросов. EF Core позволяет перехватывать запросы до того, как они будут выполнены в базе данных. Это может быть полезно для аудита, регистрации или изменения запросов.
- Отложенная загрузка. EF Core поддерживает отложенную загрузку, что означает, что связанные объекты не загружаются до тех пор, пока к ним не будет осуществлен доступ. Это может повысить производительность за счет уменьшения объема данных, которые необходимо загрузить из базы данных.
- Транзакции. EF Core поддерживает транзакции, что позволяет группировать операции базы данных в одну транзакцию. Это гарантирует, что все операции либо фиксируются, либо откатываются одновременно.
- База данных в памяти. EF Core позволяет использовать базу данных в памяти для тестирования и разработки. Это может быть полезно для запуска автоматических тестов или прототипирования.
- Собственные объекты. EF Core позволяет определять собственные объекты, то есть объекты, которые всегда принадлежат другому объекту. Это может быть полезно для хранения объектов со сложными значениями или иерархических данных.
- Разбиение таблицы. EF Core позволяет разделить таблицу на несколько объектов. Это может быть полезно, когда таблица содержит данные, которые логически разделены, но хранятся в одной таблице.
- Фильтры запросов. EF Core позволяет применять глобальные фильтры запросов, которые автоматически применяются ко всем запросам. Это может быть полезно для обеспечения безопасности доступа к данным или мягкого удаления.
- Теневые свойства. EF Core позволяет вам определять свойства ваших сущностей, которые не сопоставляются с базой данных. Это может быть полезно для хранения метаданных или вычисляемых значений.
- Необработанные SQL-запросы:
var blogs = context.Blogs.FromSqlRaw("SELECT * FROM dbo.Blogs").ToList();
В этом примере выполняется необработанный SQL-запрос к базе данных и возвращается список сущностей блога.
2. Отслеживание изменений:
var blog = context.Blogs.Find(1); blog.Title = "New Title"; context.SaveChanges();
В этом примере изменяется заголовок объекта Blog и сохраняются изменения в базе данных с помощью метода SaveChanges объекта DbContext.
3. Перехват запроса:
context.GetService<Microsoft.EntityFrameworkCore.Diagnostics.IInterceptor>() .CommandExecuting((dbCommandInterceptionContext, next) => { var commandText = dbCommandInterceptionContext.Sql; // do something with the command text next(); });
В этом примере перехватываются запросы до их выполнения в базе данных и записывается текст команды SQL.
4. Отложенная загрузка:
var blog = context.Blogs.Find(1); var posts = blog.Posts; // the Posts collection is loaded only when accessed
В этом примере сущность Blog загружается из базы данных, а связанные сущности Posts не загружаются до тех пор, пока не будет получен доступ к коллекции Posts.
5. Транзакции:
using (var transaction = context.Database.BeginTransaction()) { try { context.Blogs.Add(new Blog { Title = "New Blog" }); context.SaveChanges(); context.Posts.Add(new Post { Title = "New Post", BlogId = 1 }); context.SaveChanges(); transaction.Commit(); } catch (Exception) { transaction.Rollback(); } }
В этом примере операции базы данных группируются в одну транзакцию с использованием метода BeginTransaction свойства Database объекта DbContext.
6. База данных в памяти:
var options = new DbContextOptionsBuilder<BlogContext>() .UseInMemoryDatabase(databaseName: "BlogDatabase") .Options; using (var context = new BlogContext(options)) { context.Blogs.Add(new Blog { Title = "New Blog" }); context.SaveChanges(); var blogs = context.Blogs.ToList(); }
В этом примере создается база данных в памяти с помощью метода UseInMemoryDatabase класса DbContextOptionsBuilder, и в базу данных добавляется сущность Blog.
7. Собственные объекты:
public class Address { public string Street { get; set; } public string City { get; set; } public string State { get; set; } } public class Author { public int Id { get; set; } public string Name { get; set; } public Address Address { get; set; } } modelBuilder.Entity<Author>().OwnsOne(a => a.Address);
В этом примере определяется принадлежащая сущность под названием Address и включается в качестве свойства сущности Author. Метод Fluent API OwnsOne используется для настройки отношений между двумя сущностями.
8. Разбиение таблицы:
public class Blog { public int Id { get; set; } public string Title { get; set; } public string Url { get; set; } public ICollection<BlogAuthor> Authors { get; set; } } public class BlogAuthor { public int BlogId { get; set; } public int AuthorId { get; set; } public Blog Blog { get; set; } public Author Author { get; set; } } modelBuilder.Entity<BlogAuthor>().ToTable("BlogAuthors");
В этом примере сущность Blog разбивается на две таблицы: Blogs и BlogAuthors. Таблица BlogAuthors включает отношение «многие ко многим» между сущностями «Блог» и «Автор». Метод ToTable API Fluent используется для указания имени таблицы для объекта BlogAuthor.
9. Свойства тени:
modelBuilder.Entity<Blog>().Property<string>("CreatedBy");
В этом примере определяется теневое свойство с именем «CreatedBy» для объекта «Блог». Теневые свойства не определяются как свойства класса сущностей, а вместо этого управляются EF Core.
10. Глобальные фильтры запросов:
modelBuilder.Entity<Blog>().HasQueryFilter(b => !b.IsDeleted);
В этом примере к сущности Blog применяется глобальный фильтр запроса, который исключает любые сущности, для которых свойство IsDeleted имеет значение true. Глобальные фильтры запросов применяются ко всем запросам, которые обращаются к объекту, включая упреждающую загрузку и отложенную загрузку.
Я надеюсь, что эти примеры помогут проиллюстрировать различные расширенные функции EF Core!
Заключение:
В заключение следует отметить, что Entity Framework Core предоставляет богатый набор функций, позволяющих разработчикам работать с базой данных с помощью высокоуровневого объектно-ориентированного API. Мы рассмотрели некоторые расширенные функции EF Core, в том числе разделение таблиц, сложные типы, собственные сущности, фильтры запросов и преобразования значений, среди прочего.
Используя эти функции, разработчики могут создавать более эффективные и производительные запросы к базе данных, обрабатывать сложные отношения между сущностями и работать с пользовательскими типами данных. EF Core упрощает работу с базой данных, сокращая объем шаблонного кода, который необходимо написать, и позволяя разработчикам сосредоточиться на логике своего приложения.
В целом Entity Framework Core — это мощный инструмент, который может помочь разработчикам работать с базами данных более эффективно и результативно, что делает его неотъемлемой частью любого современного стека приложений.