Прочитать на английском

Поделиться через


Entity Framework Core

Entity Framework (EF) Core — это простая, кроссплатформенная и расширяемая версия популярной технологии доступа к данным Entity Framework с открытым исходным кодом.

EF Core может использоваться в качестве объектно-реляционного модуля сопоставления (O/RM), который:

  • Позволяет разработчикам .NET работать с базой данных с помощью объектов .NET.
  • Устраняет необходимость в большей части кода для доступа к данным, который обычно приходится писать.

EF Core поддерживает множество систем баз данных. Дополнительные сведения см. в разделе Поставщики баз данных.

Модель

В EF Core доступ к данным осуществляется с помощью модели. Модель состоит из классов сущностей и объекта контекста, который представляет сеанс взаимодействия с базой данных. Объект контекста позволяет выполнять запросы и сохранять данные. Дополнительные сведения см. в разделе Создание модели.

EF поддерживает следующие подходы к разработке моделей:

  • Создание модели на основе существующей базы данных.
  • Ручной код модели для сопоставления базы данных.
  • После создания модели используйте Миграции EF для создания базы данных на основе модели. Миграции позволяют развивать базу данных по мере изменения модели.
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;

namespace Intro;

public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(
            @"Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;ConnectRetryCount=0");
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
    public int Rating { get; set; }
    public List<Post> Posts { get; set; }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public int BlogId { get; set; }
    public Blog Blog { get; set; }
}

Выполнение запроса

Экземпляры классов сущностей извлекаются из базы данных с помощью LINQ. Дополнительные сведения см. в разделе Выполнение запросов к данным.

using (var db = new BloggingContext())
{
    var blogs = db.Blogs
        .Where(b => b.Rating > 3)
        .OrderBy(b => b.Url)
        .ToList();
}

Сохранение данных

Для создания, удаления и изменения данных в базе данных используются экземпляры классов сущностей. Дополнительные сведения см. в разделе Сохранение данных.

using (var db = new BloggingContext())
{
    var blog = new Blog { Url = "http://sample.com" };
    db.Blogs.Add(blog);
    db.SaveChanges();
}

Рекомендации по технологиям O/RM для EF

Хотя EF Core хорошо подходит для абстрагирования многих деталей при программировании, существуют некоторые рекомендации, которые применяются ко всем технологиям O/RM и помогают избежать распространенных ошибок в рабочих приложениях.

  • Знания базового сервера базы данных на промежуточном уровне или выше необходимы для проектирования, отладки, профилирования и переноса данных в рабочих приложениях с высокой производительностью. Например, знание первичных и внешних ключей, ограничений, индексов, нормализации, инструкций DML и DDL, типов данных, профилирования и т. д.
  • Функциональное и интеграциочное тестирование. Важно реплицировать рабочую среду как можно ближе:
    • Находите проблемы в приложениях, которые отображаются только при использовании определенных версий или выпуска сервера базы данных.
    • Перехватывать критические изменения при обновлении EF Core и других зависимостей. Например, при добавлении или обновлении платформ, таких как ASP.NET Core, OData или AutoMapper. Эти зависимости могут повлиять на EF Core неожиданным образом.
  • Производительность и нагрузочное тестирование с репрезентативными нагрузками. Упрощенное использование некоторых функций затрудняет масштабирование. К таким случаям относятся: использование Includes в нескольких коллекциях, интенсивное применение отложенной загрузки, условные запросы к неиндексированным столбцам, массовые обновления и вставки с использованием созданных хранилищем значений, отсутствие обработки параллелизма, крупные модели и недостаточная политика кэширования.
  • Проверка безопасности: например, обработка строка подключения и других секретов, разрешений базы данных для операций без развертывания, проверка входных данных для необработанного SQL, шифрование конфиденциальных данных. См. раздел "Безопасные потоки проверки подлинности" для безопасной конфигурации и потока проверки подлинности.
  • Убедитесь, что ведение журнала и диагностика настроены в достаточной степени и в удобной форме. Например, соответствующая конфигурация ведения журнала, теги запросов и Application Insights.
  • Восстановление после ошибок. Проанализируйте непредвиденные ситуации для распространенных сценариев сбоев, такие как откат версий, резервные серверы, горизонтальное масштабирование и балансировка нагрузки, устранение атак типа "отказ в обслуживании" и резервное копирование данных.
  • Развертывание и миграция приложений. Спланируйте, как будет применяться миграция во время развертывания. Если миграция выполняется при запуске приложения, на нее могут негативно повлиять проблемы с параллелизмом, к тому же для нее потребуются более высокие разрешения по сравнению с обычной работой. Используйте промежуточное хранение, чтобы упростить восстановление после неустранимых ошибок во время миграции. Дополнительные сведения см. в разделе Применение миграций.
  • Подробное изучение и тестирование созданных миграций. Необходимо тщательно протестировать миграции перед применением к рабочим данным. Форму схемы и типы столбцов невозможно легко изменить, если таблицы содержат рабочие данные. Например, в SQL Server nvarchar(max) и decimal(18, 2) редко являются наиболее подходящими типами для столбцов, сопоставленных со строковыми и десятичными свойствами. Однако в EF они используются по умолчанию, так как EF не знает о вашем конкретном сценарии.

Следующие шаги

Вводные руководства см. в разделе Начало работы с Entity Framework Core.