Установка Entity Framework Core
EF Core поставляется как пакеты NuGet. Чтобы добавить EF Core в приложение, установите пакет NuGet для поставщика базы данных, который вы хотите использовать. Список доступных поставщиков баз данных см. в разделе «Поставщики баз данных».
Установить или обновить пакеты NuGet можно в интерфейсе командной строки (CLI) .NET Core, а также в диалоговом окне или консоли диспетчера пакетов Visual Studio.
Интерфейс командной строки .NET Core
- Чтобы установить или обновить поставщик EF Core SQL Server, выполните следующую команду интерфейса командной строки .NET Core в командной строке операционной системы:
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
Диалоговое окно диспетчера пакетов NuGet в Visual Studio
- В меню Visual Studio выберите «Проект» > «Управление пакетами NuGet»
- Нажмите кнопку Обзор или откройте вкладку Обновления.
- Чтобы установить или обновить поставщик SQL Server, выберите пакет Microsoft.EntityFrameworkCore.SqlServer и подтвердите свой выбор.
Консоль диспетчера пакетов NuGet в Visual Studio
- В меню Visual Studio выберите «Сервис» > «Диспетчер пакетов NuGet» > «Консоль диспетчера пакетов»
- Чтобы установить поставщик SQL Server, в консоли диспетчера пакетов выполните следующую команду:
Install-Package Microsoft.EntityFrameworkCore.SqlServer
Получение инструментов Entity Framework Core
Вы можете установить инструменты для выполнения задач, связанных с EF Core, в своем проекте, таких как создание и применение миграций базы данных, а также создание модели EF Core на основе существующей базы данных.
Доступно два набора инструментов:
- Инструменты интерфейса командной строки (CLI) .NET Core можно использовать в Windows, Linux и macOS. Эти команды начинаются с dotnet ef .
- Инструменты консоли диспетчера пакетов работают в Visual Studio в Windows. Эти команды начинаются с глагола, например Add-Migration , Update-Database .
Получение инструментов CLI для .NET Core
Для инструментов CLI .NET Core требуется пакет SDK для .NET Core, указанный ранее в разделе Необходимые компоненты.
-
Средство dotnet ef должно быть установлено в качестве глобального или локального средства. Большинство разработчиков предпочитают устанавливать средство dotnet ef в качестве глобального средства, используя следующую команду:
dotnet tool install --global dotnet-ef
dotnet add package Microsoft.EntityFrameworkCore.Design
Всегда используйте версии пакетов инструментов, которые соответствуют основному номеру версии для пакетов среды выполнения.
Получение инструментов консоли диспетчера пакетов
Чтобы получить инструменты консоли диспетчера пакетов для EF Core, установите пакет Microsoft.EntityFrameworkCore.Tools . Например, в Visual Studio:
Install-Package Microsoft.EntityFrameworkCore.Tools
Обновление до последней версии EF Core
- Каждый раз, когда мы выпускаем новую версию EF Core, мы также выпускаем новую версию поставщиков, которые являются частью проекта EF Core, например Microsoft.EntityFrameworkCore.SqlServer, Microsoft.EntityFrameworkCore.Sqlite, Microsoft.EntityFrameworkCore.Cosmos и Microsoft.EntityFrameworkCore.InMemory. Кроме того, можно просто обновить поставщик до новой версии, чтобы получить все улучшения.
- Если требуется обновить приложение, использующее сторонний поставщик базы данных, всегда ищите обновление поставщика, совместимое с нужной вам версией EF Core. Например, поставщики баз данных для версии 1.0 несовместимы с версией 2.0 среды выполнения EF Core и т. д.
- Сторонние поставщики EF Core обычно не выпускают исправления вместе со средой выполнения EF Core. Чтобы обновить приложение, которое использует стороннего поставщика до версии исправления EF Core, может потребоваться добавить прямую ссылку на отдельные компоненты среды выполнения EF Core, в частности Microsoft.EntityFrameworkCore и Microsoft.EntityFrameworkCore.Relational.
ASP.NET Web API + Entity Framework + Microsoft SQL Server + Angular. Часть 1

Небольшой курс по созданию простого веб-приложения с помощью технологий ASP.NET Core, фреймворка Entity Framework, СУБД Microsoft SQL Server и фреймворка Angular. Тестировать Web API будем через приложение Postman.
Курс состоит из нескольких частей:
- Создание Web API с помощью ASP.NET Web API и Entity Framework Core.
- Реализация пользовательского интерфейса на Angular.
- Добавление аутентификации в приложение.
- Расширение модели приложения и рассмотрение дополнительных возможностей Entity Framework.
Часть 1. Создание Web API с помощью ASP.NET Web API и Entity Framework Core
В качестве примера будем расматривать уже ставшее классическим — приложение списка дел. Для разработки приложения я буду использовать Visual Studio 2019(в Visual Studio 2017 процесс аналогичен).
Создание проекта
Создадим новый проект ASP.NET Core Web Application в Visual Studio:

Назовем приложение и укажем путь к каталогу с проектом:

И выберем шаблон приложения API:

Модель
Создадим каталог Models и в новый каталог добавим первый класс TodoItem.cs, объекты которого будут описывать некоторые задачи списка дел в приложении:
public class TodoItem < public int Id < get; set; >public string TaskDescription < get; set; >public bool IsComplete < get; set; >>
В качестве СУБД мы будем использовать Sql Server, а доступ к базе данных будет осуществляться через Entity Framework Core и для начала установим фреймворк через встроенный пакетный менеджер NuGet:

Одним из подходов в работе с Entity Framework является подход «Code-First». Суть подхода заключается в том, что на основе модели приложения(в нашем случае модель представляет единственный класс — TodoItem.cs) формируется струткура базы данных(таблицы, первичные ключи, ссылки), вся эта работа происходит как бы «за кулисами» и напрямую с SQL мы не работаем. Обязательным условием класса модели является наличие поля первичного ключа, по умолчанию Entity Framework ищет целочисленное поле в имени которого присутствует подстрока «id» и формирует на его основе первичный ключ. Переопределить такое поведение можно с помощью специальных атрибутов или используя возможности Fluent API.
Главным компонентом в работе с Entity Framework является класс контекста базы данных, через который собственно и осуществляется доступ к данным в таблицах:
public class EFTodoDBContext : DbContext < public EFTodoDBContext(DbContextOptionsoptions) : base(options) < >public DbSet TodoItems < get; set; >>
Базовый класс DbContext создает контекст БД и обеспечивает доступ к функциональности Entity Framework.
Для хранения данных приложения мы будем использовать SQL Server 2017 Express. Строки подключения хранятся в файле JSON под названием appsettings.json:
Далее нужно внести изменения в класс Startup.cs, добавив в метод ConfigureServices() следующий код:
services.AddDbContext(options => options.UseSqlServer(Configuration["ConnectionStrings:DefaultConnection"]));
Метод AddDbContext() настраивает службы, предоставляемые инфраструктурой Entity Framework Core для класса контекста базы EFTodoDBContext. Аргументом метода AddDbContext () является лямбда-выражение, которое получает объект options, конфигурирующий базу данных для класса контекста. В этом случае база данных конфигурируется с помощью метода UseSqlServer() и указания строки подключения.
Определим основные операции для работы с задачами в интерфейсе ITodoRepository:
public interface ITodoRepository < IEnumerableGet(); TodoItem Get(int id); void Create(TodoItem item); void Update(TodoItem item); TodoItem Delete(int id); >
Данный интерфейс позволяет нам не задумываться о конкретной реализации хранилища данных, возможно мы точно не определились с выбором СУБД или ORM фреймворком, сейчас это не важно, класс описывающий доступ к данным будет наследовать от этого интерфейса.
Реализуем репозиторий, который как уже сказано ранее, будет наследовать от ITodoRepository и использовать в качестве источника данных EFTodoDBContext:
public class EFTodoRepository : ITodoRepository < private EFTodoDBContext Context; public IEnumerableGet() < return Context.TodoItems; >public TodoItem Get(int Id) < return Context.TodoItems.Find(Id); >public EFTodoRepository(EFTodoDBContext context) < Context = context; >public void Create(TodoItem item) < Context.TodoItems.Add(item); Context.SaveChanges(); >public void Update(TodoItem updatedTodoItem) < TodoItem currentItem = Get(updatedTodoItem.Id); currentItem.IsComplete = updatedTodoItem.IsComplete; currentItem.TaskDescription = updatedTodoItem.TaskDescription; Context.TodoItems.Update(currentItem); Context.SaveChanges(); >public TodoItem Delete(int Id) < TodoItem todoItem = Get(Id); if (todoItem != null) < Context.TodoItems.Remove(todoItem); Context.SaveChanges(); >return todoItem; > >
Контроллер
Контроллер, реализация которого будет описана ниже, ничего не будет знать о контексте данных EFTodoDBContext, а будет использовать в своей работе только интерфейс ITodoRepository, что позволяет изменить источник данных не меняя при этом контроллера. Такой подход Адам Фримен в своей книге «Entity Framework Core 2 для ASP.NET Core MVC для профессионалов» назвал — паттерн «Хранилище».
Контроллер реализует обработчики стандартных методов HTTP-запросов: GET, POST, PUT, DELETE, которые будут изменять состояние наших задач, описанных в классе TodoItem.cs.
Добавим в каталог Controllers класс TodoController.cs со следующим содержимым:
[Route("api/[controller]")] public class TodoController : Controller < ITodoRepository TodoRepository; public TodoController(ITodoRepository todoRepository) < TodoRepository = todoRepository; >[HttpGet(Name = "GetAllItems")] public IEnumerable Get() < return TodoRepository.Get(); >[HttpGet("", Name = "GetTodoItem")] public IActionResult Get(int Id) < TodoItem todoItem = TodoRepository.Get(Id); if (todoItem == null) < return NotFound(); >return new ObjectResult(todoItem); > [HttpPost] public IActionResult Create([FromBody] TodoItem todoItem) < if (todoItem == null) < return BadRequest(); >TodoRepository.Create(todoItem); return CreatedAtRoute("GetTodoItem", new < >, todoItem); > [HttpPut("")] public IActionResult Update(int Id, [FromBody] TodoItem updatedTodoItem) < if (updatedTodoItem == null || updatedTodoItem.Id != Id) < return BadRequest(); >var todoItem = TodoRepository.Get(Id); if (todoItem == null) < return NotFound(); >TodoRepository.Update(updatedTodoItem); return RedirectToRoute("GetAllItems"); > [HttpDelete("")] public IActionResult Delete(int Id) < var deletedTodoItem = TodoRepository.Delete(Id); if (deletedTodoItem == null) < return BadRequest(); >return new ObjectResult(deletedTodoItem); > >
Перед определением класса указан атрибут с описанием шаблона маршрута для доступа к контроллеру: [Route(«api/[controller]»)]. Контроллер TodoController будет доступен по следующему маршруту: https://:/api/todo. В [controller] указывается название класса контроллера в нижнем регистре, опуская часть «Controller».
Перед определением каждого метода в контроллере TodoController указан специальный атрибут вида: [(«параметр»,Name = «псевдоним метода»)]. Атрибут определяет какой HTTP-запрос будет обработан данным методом, параметр, который передается в URI запроса и псевдоним метода с помощью которого можно переотправлять запрос. Если не указать атрибут, то по умолчанию инфраструктура MVC попытается найти самый подходящий метод в контроллере для обработки запроса исходя из названия метода и указанных параметров в запросе, так, если не указать в контроллере TodoController атрибут для метода Get(), то при HTTP-запросе методом GET: https://:/api/todo, инфраструткура определит для обработки запроса метод Get() контроллера.
В своем конструкторе контроллер получает ссылку на объект типа ITodoRepository, но пока что инфраструктура MVC не знает, какой объект подставить при создании контроллера. Нужно создать сервис, который однозначно разрешит эту зависисмость, для этого внесем некотрые изменения в класс Startup.cs, добавив в метод ConfigureServices() следующий код:
services.AddTransient();
Метод AddTransient() определяет сервис, который каждый раз, когда требуется экземпляр типа ITodoRepository, например в контроллере, создает новый экземпляр класс EFTodoRepository.
Полный код класса Startup.cs:
public class Startup < public Startup(IConfiguration configuration) < Configuration = configuration; >public IConfiguration Configuration < get; >public void ConfigureServices(IServiceCollection services) < services.AddControllers(); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_3_0); services.AddDbContext(options => options.UseSqlServer(Configuration["ConnectionStrings:DefaultConnection"])); services.AddTransient(); > public void Configure(IApplicationBuilder app, IWebHostEnvironment env) < if (env.IsDevelopment()) < app.UseDeveloperExceptionPage(); >app.UseHttpsRedirection(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => < endpoints.MapControllers(); >); > >
Миграции
Для того чтобы Entity Framework сгенерировал базу данных и таблицы на основе модели, нужно использовать процесс миграции базы данных. Миграции — это группа команд, которая выполняет подготовку базы данных для работы с Entity Framework. Они используются для создания и синхронизации базы данных. Команды можно выполнять как в консоли диспетчера пакетов (Package Manager Console), так и в Power Shell(Developer Power Shell). Мы будем использовать консоль диспетчера пакетов, для работы с Entity Framework потребуется установить пакет Microsoft.EntityFrameworkCore.Tools:

Запустим консоль диспетчера пакетов и выполним команду Add-Migration Initial:


В проекте появится новый каталог — Migrations, в котором будут хранится классы миграции, на основе которых и будут создаваться объекты в базе данных после выполнения команды Update-Database:

Web API готово, запустив приложение на локальном IIS Express мы можем протестировать работу контроллера.
Тестирование WebAPI
Создадим новую коллекцию запросов в Postman под названием TodoWebAPI:

Так как наша база пуста, протестируем для начала создание новой задачи. В контроллере за создание задач отвечает метод Create(), который будет обрабатывать HTTP запрос отправленный методом POST и будет содержать в теле запроса сериализированный объект TodoItem в JSON формате. Аттрибут [FromBody] перед параметром todoItem в методе Create() подсказывает инфраструктуре MVC, что нужно десериализировать объект TodoItem из тела запроса и передать его в качестве параметра методу. Создадим запрос в Postman, который отправит на webAPI запрос на создание новой задачи:

Метод Create() после успешного создания задачи перенаправляет запрос на метод Get() с псевдонимом «GetTodoItem» и передает в качестве параметра Id только что созданной задачи, в результате чего в ответ на запрос мы получим созданный объект задачи в формате JSON.
Отправив HTTP запрос методом PUT и указав при этом в URI Id(https://localhost:44370/api/todo/1) уже созданного объекта, а в теле запроса передав объект с некоторыми изменениями в формате JSON, мы изменим этот объект в базе:

HTTP запросом с методом GET без указания параметров получим все объекты в базе:

Запрос HTTP с методом DELETE и указанием Id объекта в URI(https://localhost:44370/api/todo/2), удалит объект из базы и вернет JSON с удаленной задачей:

На этом все, в следующей части реализуем пользовательский интерфейс с помощью JavaScript-фреймворка Angular.
Основная установка Entity Framework (EF)
Эта функция доступна в NCache Предприятие и Professional издания.
Предпосылки
Текущая версия этого пакета поддерживает:
Установить пакет NuGet
Установите следующие пакеты NuGet в свое приложение, выполнив следующую команду в консоли диспетчера пакетов:
- EntityFrameworkCore.NCache для предприятия
Install-Package EntityFrameworkCore.NCache
- EntityFrameworkCore.NCache для профессионалов
Install-Package EntityFrameworkCore.NCache.Professional
Включить пространства имен
Чтобы использовать API, включите в свое приложение следующие пространства имен:
- Alachisoft.NCache.EntityFrameworkCore
- Alachisoft.NCache.Runtime.Caching
Пример кода
Пример кода для EF Core можно найти на GitHub.
Как установить entity framework в visual studio 2019
Данное руководство устарело. Актуальное руководство: Руководство по Entity Framework Core 7
Последнее обновление: 14.11.2020
Платформу Entity Framework Core можно применять в различных технологиях стека .NET. В данном случае мы будем рассматривать базовые моменты платформы на примере консольных приложений, как наиболее простых и не содержащих никакого лишнего кода. Но в последствии также затронем применение EF Core и в других технологиях на конкретных примерах.
Итак, создадим первое приложение с использованием Entity Framework Core. Для этого создадим в Visual Studio 2019 новый проект по типу Console App (.NET Core) , который назовем HelloApp:

Итак, Visual Studio создает проект с базовой примитивной структурой, где можно выделить собственно файл логики приложения — файл Program.cs . И чтобы начать работать с EntityFramework Core, нам необходимо вначале добавить в проект пакет EntityFramework Core. Для этого перейдем в проекте к пакетному менеджеру NuGet.
Однако здесь мы ищем не общий пакет для Entity Framework Core, а пакет для конкретной СУБД. Так, в данном случае мы будем использовать MS SQL Server в качестве СУБД, поэтому нам надо искать пакет Microsoft.EntityFrameworkCore.SqlServer :

В качестве альтернативы для добавления пакетов можно использовать Package Manager Console . Для этого в меню Visual Studio перейдем к пункту Tools -> NuGet Package Manager -> Package Manager Console
В открывшемся внизу в Visual Studio окне Package Manager Console введем команду:
Install-Package Microsoft.EntityFrameworkCore.SqlServer
После выполнения этой команды выполним вторую команду:
Install-Package Microsoft.EntityFrameworkCore.Tools
Итак, необходимые пакеты добавлены. Теперь мы можем их использовать.
Далее нам надо определить модель, которая будет описывать данные. Пусть наше приложение будет посвящено работе с пользователями. Поэтому добавим в проект новый класс User:
public class User < public int Id < get; set; >public string Name < get; set; >public int Age < get; set; >>
Это обычный класс, который содержит несколько свойств. Каждое свойство будет сопоставляться с отдельным столбцом в таблице из бд.
Надо отметить, что Entity Framework требует определения ключа элемента для создания первичного ключа в таблице в бд. По умолчанию при генерации бд EF в качестве первичных ключей будет рассматривать свойства с именами Id или [Имя_класса]Id (то есть UserId).
Взаимодействие с базой данных в Entity Framework Core происходит посредством специального класса — контекста данных. Поэтому добавим в наш проект новый класс, который назовем ApplicationContext и который будет иметь следующий код:
using Microsoft.EntityFrameworkCore; namespace HelloApp < public class ApplicationContext : DbContext < public DbSetUsers < get; set; >public ApplicationContext() < Database.EnsureCreated(); >protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) < optionsBuilder.UseSqlServer("Server=(localdb)\\mssqllocaldb;Database=helloappdb;Trusted_Connection=True;"); >> >
Основу функциональности Entity Framework Core для работы с MS SQL Server составляют классы, которые располагаются в пространстве имен Microsoft.EntityFrameworkCore . Среди всего набора классов этого пространства имен следует выделить следующие:
- DbContext : определяет контекст данных, используемый для взаимодействия с базой данных
- DbSet/DbSet : представляет набор объектов, которые хранятся в базе данных
- DbContextOptionsBuilder : устанавливает параметры подключения
В любом приложении, работающим с БД через Entity Framework, нам нужен будет контекст (класс производный от DbContext). В данном случае таким контекстом является класс ApplicationContext.
И также в классе определено одно свойство Users, которое будет хранить набор объектов User. В классе контекста данных набор объектов представляет класс DbSet . Через это свойство будет осуществляться связь с таблицей объектов User в бд.
Кроме того, для настройки подключения нам надо переопределить метод OnConfiguring . Передаваемый в него параметр класса DbContextOptionsBuilder с помощью метода UseSqlServer позволяет настроить строку подключения для соединения с MS SQL Server. В данном случае мы определяем, что в качестве сервера будет использоваться движок localdb, который предназначен специально для разработки, ( «Server=(localdb)\\mssqllocaldb» ), а файл базы данных будет называться helloappdb ( «Database=helloappdb» ).
И также стоит отметить, что по умолчанию у нас нет базы данных. Поэтому в конструкторе класса контекста определен вызов метода Database.EnsureCreated() , который при создании контекста автоматически проверит наличие базы данных и, если она отсуствует, создаст ее.
Теперь определим сам код программы, который будет взаимодействовать с созданной БД. Для этого изменим класс Program следующим образом:
using System; using System.Linq; namespace HelloApp < public class Program < public static void Main(string[] args) < using (ApplicationContext db = new ApplicationContext()) < // создаем два объекта User 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(); Console.WriteLine("Объекты успешно сохранены"); // получаем объекты из бд и выводим на консоль var users = db.Users.ToList(); Console.WriteLine("Список объектов:"); foreach (User u in users) < Console.WriteLine($". - "); > > Console.Read(); > > >
Так как класс ApplicationContext через базовый класс DbContext реализует интерфейс IDisposable , то для работы с ApplicationContext с автоматическим закрытием данного объекта мы можем использовать конструкцию using .
В конструкции using создаются два объекта User и добавляются в базу данных. Для их сохранения нам достаточно использовать метод Add : db.Users.Add(user1)
Чтобы получить список данных из бд, достаточно воспользоваться свойством Users контекста данных: db.Users
В результате после запуска программа выведет на консоль:
Объекты успешно сохранены Список объектов: 1.Tom - 33 2.Alice - 26
И после добавления мы можем найти базу данных в окне SQL Server Object Explorer (открыть данное окно можно через меню View->SQL Server Object Explorer ). Там мы можем раскрыть и посмотреть содержимое ее таблиц:

Таким образом, Entity Framework Core обеспечивает простое и удобное управление объектами из базы данных. При том в данном случае нам не надо даже создавать базу данных и определять в ней таблицы. Entity Framework все сделает за нас на основе определения класса контекста данных и классов моделей. И если база данных уже имеется, то EF не будет повторно создавать ее.