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

  1. Необработанные SQL-запросы. EF Core позволяет выполнять необработанные SQL-запросы к базе данных. Это может быть полезно, когда вам нужно выполнить сложные запросы или оптимизировать производительность.
  2. Отслеживание изменений. EF Core отслеживает изменения, внесенные в объекты сущностей, и соответствующим образом обновляет базу данных. Вы также можете настроить поведение отслеживания изменений с помощью свойства DbContext.ChangeTracker.
  3. Перехват запросов. EF Core позволяет перехватывать запросы до того, как они будут выполнены в базе данных. Это может быть полезно для аудита, регистрации или изменения запросов.
  4. Отложенная загрузка. EF Core поддерживает отложенную загрузку, что означает, что связанные объекты не загружаются до тех пор, пока к ним не будет осуществлен доступ. Это может повысить производительность за счет уменьшения объема данных, которые необходимо загрузить из базы данных.
  5. Транзакции. EF Core поддерживает транзакции, что позволяет группировать операции базы данных в одну транзакцию. Это гарантирует, что все операции либо фиксируются, либо откатываются одновременно.
  6. База данных в памяти. EF Core позволяет использовать базу данных в памяти для тестирования и разработки. Это может быть полезно для запуска автоматических тестов или прототипирования.
  7. Собственные объекты. EF Core позволяет определять собственные объекты, то есть объекты, которые всегда принадлежат другому объекту. Это может быть полезно для хранения объектов со сложными значениями или иерархических данных.
  8. Разбиение таблицы. EF Core позволяет разделить таблицу на несколько объектов. Это может быть полезно, когда таблица содержит данные, которые логически разделены, но хранятся в одной таблице.
  9. Фильтры запросов. EF Core позволяет применять глобальные фильтры запросов, которые автоматически применяются ко всем запросам. Это может быть полезно для обеспечения безопасности доступа к данным или мягкого удаления.
  10. Теневые свойства. EF Core позволяет вам определять свойства ваших сущностей, которые не сопоставляются с базой данных. Это может быть полезно для хранения метаданных или вычисляемых значений.
  11. Необработанные 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 — это мощный инструмент, который может помочь разработчикам работать с базами данных более эффективно и результативно, что делает его неотъемлемой частью любого современного стека приложений.