воскресенье, 26 декабря 2021 г.

Первое приложение с Entity Framework. Подход Code First

 

Первое приложение с Entity Framework. Подход Code First

Последнее обновление: 24.10.2018

Чтобы непосредственно начать работать с Entity Framework, создадим первое приложение. Для этого нам нужна будет, во-первых, среда разработки. В качестве среды разработки выберем Visual Studio 2017.

В окне создания проекта в левой части выберем секцию Visual C # -> Рабочий стол Windows и в центральной части окна в качестве типа проекта выберем Консольное приложение (.NET Framework) .

Создание проекта для Entity Framework 6

Теперь первым делом добавим новый класс, который будет описывать данные. Пусть наше приложение будет посвящено работе с пользователями. Поэтому добавим в проект новый класс Пользователь:

1
2
3
4
5
6
public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

Это обычный класс, который содержит некоторое количество автосвойств. Каждое свойство будет сопоставляться с столбцом в таблице из бд.

Надо отметить, что Entity Framework при работе с Code First требует определения ключа для создания первичного ключа в таблице в бд. По умолчанию при генерации бд EF в качестве первичных ключей будет рассматривать свойства с именами Id или [Имя_класса] Id (то есть есть UserId). Если же мы хотим указать свойство иначе, то нам нужно добавить дополнительную логику на c #.

Теперь для взаимодействия с бд нам нужен контекст данных. Это своего рода посредник между бд и классами, описывающими данными. Но, по умолчанию еще не добавлена ​​библиотека для EF. Чтобы добавить ее, нажмем на проект правой кнопкой мыши и выберем в контекстном меню Управление пакетами NuGet ...:

Добавление Entity Framework через NuGet

Затем в появившемся окне управления NuGet-пакетами в окне поиска введем слово "Entity" и выберем пакет собственно Entity Framework и установим его:

Установка Entity Framework

После установки пакета добавим в проект новый класс UserContext:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System;
using System.Collections.Generic;
using System.Data.Entity;
 
namespace FirstEF6App
{
    class UserContext : DbContext
    {
        public UserContext()
            :base("DbConnection")
        { }
          
        public DbSet<User> Users { get; set; }
    }
}

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

  • Dbtext : использовать контекст данных, использовать для взаимодействия с базой данных.

  • DbModelBuilder : сопоставляет классы на языке C # с сущностями в базе данных.

  • DbSet / DbSet <TEntity> : представляет набор сущностей, хранящихся в базе данных

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

Вторе этого класса вызывается конструктор конструктора базового класса, который передается строка "DbConnection" - это имя будущей строки подключения к базе данных. В принципе мы можем использовать конструктор.

И также в классе определено одно свойство Users, которое будет хранить набор объектов User. В классе контекста данных набор объектов представляет класс DbSet<T>Через это свойство будет осуществляться связь с таблицей объектов Пользователь в бд.

И теперь нам надо установить подключение к базе данных. Для установки подключения обычно используется файл конфигурации приложения. В проектах для десктопных приложений файл конфигурации называется App.config (как в нашем случае), в проектах веб-приложений - web.config . В нашем случае, поскольку у нас консольное приложение, это файл App.config . После добавления Entity Framework он выглядит примерно следующим образом:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 год
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
     
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.1" />
  </startup>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>

Содержимое файла в каждом конкретном случае может отличаться. В любом случае после добавления EntityFramework в проект в нем будет содержаться элемент configSections. И после закрывающего тега </configSections>добавим следующий элемент:

1
2
3
4
<connectionStrings>
   <add name="DBConnection" connectionString="data source=(localdb)\MSSQLLocalDB;Initial Catalog=userstore;Integrated Security=True;"
providerName="System.Data.SqlClient"/>
 </connectionStrings>

Все подключения к источнику данных устанавливаются в секции connectionStrings, каждое отдельное подключение представляет элемент addВ конструкторе класса контекста UserContext мы передаем в качестве названия подключения строку "DbConnection", поэтому данное название указывается в атрибуте name="DBConnection".

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 год
22
23
24
25
26
27
28 год
29
30
31 год
32
using System;
 
namespace FirstEF6App
{
    class Program
    {
        static void Main(string[] args)
        {
            using(UserContext db = new UserContext())
            {
                // создаем два объекта User
                User user1 = new User { Name = "Tom", Age = 33 };
                User user2 = new User { Name = "Sam", Age = 26 };
 
                // добавляем их в бд
                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два объекта Пользователь и добавлены в базу данных. Для их сохранения нам достаточно использовать метод Adddb.Users.Add(user1)

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

В результате после запуска программа выведет на консоль:

Объекты успешно сохранены
Список объектов:
1. Том - 33
2.Сам - 26

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

Наша задача - только определить, которая будет храниться в базе данных, и класс контекста. Поэтому данный подход называется Code First - сначала пишется код, а затем по нему создается база данных и ее таблица.

Возникает вопрос, а где же находится БД? Чтобы физически использовать данные, мы можем подключиться к ней из Visual Studio через окно View-> SQL Server Object Explorer . После этого мы можем увидеть в обозревателе объектов SQL Server, посмотреть ее строение, таблицу, открыть и даже изменить данные в таблицах:

Обозреватель объектов SQL Server в Visual Studio

Физически по умолчанию будет располагаться в базе данных пользователя, в частности, у меня она размещена в каталоге C: \ Users \ Eugene \ , только к ее названию буде добавлено стандартное расширение mdf - userstore.mdf.

И теперь мы можем взаимодействовать с базой данных:

1
2
3
4
5
using(UserContext db = new UserContext())
{
    foreach (User u in db.Users)
        Console.WriteLine("{0}.{1} - {2}", u.Id, u.Name, u.Age);
}

Комментариев нет:

Отправить комментарий

Паттерн 'Репозиторий' в ASP.NET

  Последнее обновление: 1.11.2015         Одним из наиболее часто используемых паттернов при работе с данными является паттерн 'Репозито...