Языки программирования

Entity Framework

ADO.NET Entity Framework (EF) — объектно-ориентированная технология доступа к данным, является object-relational mapping (ORM) решением для .NET Framework от Microsoft.
Предоставляет возможность взаимодействия с объектами как посредством LINQ в виде LINQ to Entities, так и с использованием Entity SQL.
Entity SQL представляет собой язык, подобный языку SQL, который позволяет выполнять запросы к концептуальным моделям в Entity Framework
Для облегчения построения web-решений используется как ADO.NET Data Services (Astoria), так и связка из Windows Communication Foundation и Windows Presentation Foundation, позволяющая строить многоуровневые приложения, реализуя один из шаблонов проектирования MVC, MVP или MVVM.
Релиз ADO.NET Entity Framework состоялся 11 августа 2008 года в составе .NET Framework 3.5 Service Pack 1 и Visual Studio 2008 Service Pack 1.
В VS 2008 вошёл EDM Wizard для реверс-инжиниринга существующих баз данных и EDM Designer для редактирования сгенерированных моделей или создания их с нуля.
Версия 6.0 была выпущена 17 октября 2013 года[3] и сейчас это проект с открытым исходным кодом под лицензией Apache License v2. В версии 6.0 был сделан ряд улучшений в поддержке метода работы Code First.
Начиная с версии Entity Framework 4.1 предоставляется три подхода по проектированию базы данных:

Database-First

Подходит для проектировщиков баз данных — сначала необходимо создать базу данных с помощью различных инструментов (например, SQL Server Management Studio), а затем генерируете EDMX-модель базы данных (предоставляет удобный графический интерфейс для взаимодействия с базой данных в виде диаграмм и объектную модель в виде классов C#).
В данном случае вам нужно работать с SQL Server и хорошо знать синтаксис T-SQL, но при этом не нужно разбираться в C#.

Model-First

Подходит для архитекторов — сначала создается графическая модель EDMX в Visual Studio (в фоновом режиме создаются классы C# модели), а затем генерируете на основе диаграммы EDMX базу данных.
При данном подходе не нужно знать ни деталей T-SQL ни синтаксиса C#.

Code-First

Подходит для программистов — при данном подходе модель EDMX вообще не используется и необходимо вручную настраивать классы C# объектной модели (данный подход поддерживает как генерацию сущностных классов из существующей базы данных, так и создание базы данных из созданной вручную модели объектов C#).
Данный способ подходит для программистов, хорошо знакомых с синтаксисом C#.

Установка Entity Framework

Подключить Entity Framework можно к любому проекту — от Xamarin до ASP.NET.
Для начала создайте проект Console Application в Visual Studio. Затем откройте менеджер пакетов NuGet:
NuGet Manager – это инструмент, который помогает разработчику управлять сторонними библиотеками (пакетами) в своем проекте.

Скачиваем пакет с этим фреймворком:
При установке соглашаемся с изменениями и лицензией:

Создание первого приложения

Наше приложение будет создано с помощью подхода Code First.
Когда Entity Framework установится, нужно подключиться к СУБД. Это делается с помощью файла конфигурации.
Так как рассматривается консольное приложение, то надо создать и открыть файл App.config (нажимаем правой кнопкой мыши на файл нашего проекта):
В файл App.config необходимо добавить следующий код:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add name="DBConnection" connectionString="data source=.\SQLEXPRESS;Initial Catalog=GameDB;Integrated Security=True;"
  providerName="System.Data.SqlClient"/>
  </connectionStrings>
</configuration>
Все подключения к источникам данных устанавливаются в секции connectionStrings, а каждое отдельное подключение представляет элемент add.

В конструкторе класса контекста UserContext мы передаем в качестве названия подключения строку «DbConnection», поэтому данное название указывается в атрибуте name=»DBConnection».

Настройку строки подключения задает атрибут connectionString. В данном случае мы устанавливаем название базы данных, с которой будем взаимодействовать — userstore.

В качестве СУБД мы используем MS SQL Server 2019.

Наше приложение будет посвящено работе с пользователями. Поэтому добавим в проект новый класс User:
using System;
using System.Collections.Generic;
using System.Data.Entity;

namespace consol
{
    public class User
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
    }

    class UserContext : DbContext
    {
        public UserContext()
            : base("DbConnection")
        { }

        public DbSet Users { get; set; }
    }
}
Это обычный класс, который содержит некоторое количество автосвойств. Каждое свойство будет сопоставляться с отдельным столбцом в таблице из БД.

Основу функциональности Entity Framework составляют классы, находящиеся в пространстве имен System.Data.Entity. Среди всего набора классов этого пространства имен следует выделить следующие:

  • DbContext: определяет контекст данных, используемый для взаимодействия с базой данных.
  • DbModelBuilder: сопоставляет классы на языке C# с сущностями в базе данных.
  • DbSet/DbSet<TEntity>: представляет набор сущностей, хранящихся в базе данных.

В любом приложении, работающим с БД через Entity Framework, нам нужен будет контекст (класс производный от DbContext) и набор данных DbSet, через который мы сможем взаимодействовать с таблицами из БД. В данном случае таким контекстом является класс UserContext.

Теперь перейдем к файлу Program.cs и изменим его содержание следующим образом:
using System;

namespace consol
{
    class Program
    {
        static void Main(string[] args)
        {
            using (UserContext db = new UserContext())
            {
                // создаем два объекта User
                User user1 = new User { Name = "Виктор", Age = 24 };
                User user2 = new User { Name = "Максим", Age = 25 };

                // добавляем их в бд
                db.Users.Add(user1);
                db.Users.Add(user2);
                db.SaveChanges();
                Console.WriteLine("Объекты успешно сохранены");

                // получаем объекты из бд и выводим на консоль
                var users = db.Users;
                Console.WriteLine("Список объектов:");
                foreach (User u in users)
                {
                    Console.WriteLine("{0}.{1} - {2}", u.Id, u.Name, u.Age);
                }
            }
            Console.Read();
        }
    }
}
Так как класс UserContext через родительский класс DbContext реализует интерфейс IDisposable, то для работы с UserContext с автоматическим закрытием данного объекта мы можем использовать конструкцию using.

В конструкции using создаются два объекта User и добавляются в базу данных. Для их сохранения нам достаточно использовать метод Add: db.Users.Add(user1)

Чтобы получить список данных из бд, достаточно воспользоваться свойством Users контекста данных: db.Users

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

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

Проверить базу данных можно в обозревателе объектов SQL Server Management Studio:
Самоучитель по C#