5 место Выходим на новый уровень работы с БД [Entity Framework + ZennoPoster]

Sherminator

Client
Регистрация
10.09.2021
Сообщения
997
Благодарностей
536
Баллы
93
107036

Введение

Всем привет, добро пожаловать на девятнадцатый конкурс статей! В своей статье я расскажу каким образом можно связать ZennoPoster и Entity Framewok. Сразу скажу, данная связка будет в первую очередь полезна тем кто знает c# хотя бы на базовом уровне, остальным предлагаю эту статью в качестве общего развития.

Начну с того, что такое Entity Framework и в чем плюсы его использования:
Entity Framework это набор инструментов разработки. Он предоставляет удобный способ работы с данными хранящимися в БД, без необходимости писать много кода для выполнения обычных операций, таких как выборка, вставка, обновление и удаление данных.
Проще говоря, мы будем работать с базой данных на более высоком уровне абстракции. Не будет никаких sql запросов, будут классы и объекты.
Еще один жирный плюс Entity Framework это интеграция с LINQ (Предоставляет удобный и выразительный способ работы с данными, используя синтаксис, похожий на SQL )
Ну и конечно же повышение читаемости кода.


Основная часть
Работать мы будем с Microsoft sql server (где его скачать и как установить вы сможете узнать по первой ссылке в гугле, ничего сложно там нет.) т.к это самый простой вариант, подключение EF к другим СУБД осуществляется с помощью дополнительных библиотек.

Начнем мы с того, что создадим в Visual Studio библиотеку классов, это и будут своего рода наши таблицы.

1.png
2.png

Теперь нам надо установить сам Entity Framework, не перепутайте с Entity Framework Core, это для другого фреймворка.
3.png
4.png

После установки создадим нашу модель, видов создания модели несколько, какая каким образом работает я рассказывать не буду, почитаете в гугле если интересно, а мы выберем пустую модель Code First, это создание БД на основе кода который мы с вами напишем.
5.png
6.png
7.png

И вот у нас самонаписался класс модели, так же в файл App.config прописалась строка подключения к нашей БД.
8.png
9.png

Так же нам в классе Model1 в закоментированом виде приведен пример создания класса MyEntity и добавления его в класс модели. Все комментарии в целом можно удалить, что бы не мешались, т.к dll которую мы подкинем в зенопостер не сможет за собой подтянуть строку подключения из файла конфига нам придется мальца подправить конструктор класса модели, по умолчанию туда передается имя строки подключения из файла App.config, мы же туда передадим сразу строку подключения.

10.png

Вот так это в итоге выглядит:
11.png

Теперь давайте создадим для теста класс User который у нас будет являться своего рода таблицей. Есть множество атрибутов которые можно применять к полям, с базовыми ознакомиться можно ниже, и подкинем его в нашу модель.

[Key]: Используется для указания первичного ключа в модели данных. Пример
:
C#:
public class Customer
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
}

[Required]: Используется для указания, что определенное свойство должно иметь значение и не может быть null. Пример:
C#:
public class Product
{
    [Key]
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }
}

[MaxLength]: Используется для указания максимальной длины строки для свойства. Пример:
C#:
public class Product
{
    [Key]
    public int Id { get; set; }

    [MaxLength(50)]
    public string Name { get; set; }
}

[Column]: Используется для указания имени столбца базы данных для свойства модели данных. Пример:
C#:
public class Product
{
    [Key]
    public int Id { get; set; }

    [Column("ProductName")]
    public string Name { get; set; }
}


[Tablе]: Используется для указания имени таблицы базы данных для модели данных.
Пример:


C#:
[Table("Customers")]
public class Customer
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
}
12.png
13.png

Ну и наконец можно сделать миграции и паковать нашу либу. В консоль диспетчера пакетов (у кого её внизу VS нету, она в настройках активируется, гугл подскажет) надо прописать 3 команды.
14.png
15.png
Тут у нас генерируется код для создания таблиц, редко но бывает что он кривовато генерится и его надо править.
16.png
С помощью последней команды мы уже создаем нашу бд и таблицы, если зайти в ms sql server то мы ее там увидим.
17.png
Теперь пакуем всё это дело, закидываем файлы из папки Release в папку ExternalAssemblies и переходим в проджект мейкер.
18.png
19.png

Добавляем ссылки из GAC и дерективы using
20.png
21.png


Практические примеры
Ну а теперь можно добавить каких нибудь данных в нашу бд и поделать выборки.
Набросал немного кода для добавления пользователей в БД и запустил шаблон на повторение, в итоге наша БД наполнилась.
22.png
В коде происходит следующее, создаем конструкцию юзинг, т.к у нас класс DbContext реализует интерфейс IDisposable то благодаря этой конструкции у нас происходит автоматическое закрытие соединения с БД после того как выполнение кода выходит за пределы конструкции. Затем создаем экземпляр класса (нашей таблицы, если можно так выразиться) и присваиваем значения, затем запихиваем экземпляр этого класса в метод Add объекта модели и сохраняем настройки с помощью метода SaveChanges.
23.png

Вот так просто мы можем перебрать нашу БД как обычный список.
24.png

Получаем фамилии всех кто из флориды.
25.png

Или то же самое только уже с использованием LINQ.
26.png

Вот примеры кода для выполнения базовых операций.

Выборка данных (SELECT):
C#:
using (var context = new YourDbContext())
{
// Получение всех записей из таблицы
var allRecords = context.YourTableName.ToList();

// Получение записей с условием
var filteredRecords = context.YourTableName.Where(x => x.SomeProperty == "SomeValue").ToList();

// Получение одной записи по идентификатору
var singleRecord = context.YourTableName.Find(id);
}
Обновление данных (UPDATE):
C#:
using (var context = new YourDbContext())
{
// Получение записи, которую необходимо обновить
var recordToUpdate = context.YourTableName.Find(id);

if (recordToUpdate != null)
{
// Обновление свойств записи
recordToUpdate.Property1 = newValue1;
recordToUpdate.Property2 = newValue2;
// и так далее

// Сохранение изменений в базе данных
context.SaveChanges();
}
}
Удаление данных (DELETE):
C#:
 using (var context = new YourDbContext())
{
// Получение записи, которую необходимо удалить
var recordToDelete = context.YourTableName.Find(id);

if (recordToDelete != null)
{
// Удаление записи из контекста и сохранение изменений в базе данных
context.YourTableName.Remove(recordToDelete);
context.SaveChanges();
}
}
Это только малая часть что можно делать используя методы DbContext и крупинка того что можно вытворять используя LINQ.


Заключение
Использование Entity Framework в связке с ZennoPoster - это мощный и удобный способ работы с базами данных в автоматизации задач. Entity Framework позволяет легко и эффективно управлять данными, освобождая нас от написания сложных SQL-запросов и обеспечивая более высокий уровень абстракции при работе с базой данных. Благодаря LINQ, мы можем выполнять разнообразные операции с данными, такие как выборка, фильтрация, сортировка и объединение, с помощью простого и понятного синтаксиса. Комбинирование мощности Entity Framework и гибкости ZennoPoster позволяет нам создавать автоматизированные решения, которые легко масштабировать и поддерживать.

Начните использовать Entity Framework сегодня и упростите свою работу с базами данных в ZennoPoster.

Спасибо за внимание)
 
Тема статьи
Другое
Номер конкурса статей
Девятнадцатый конкурс статей

Вложения

Для запуска проектов требуется программа ZennoPoster или ZennoDroid.
Это основное приложение, предназначенное для выполнения автоматизированных шаблонов действий (ботов).
Подробнее...

Для того чтобы запустить шаблон, откройте нужную программу. Нажмите кнопку «Добавить», и выберите файл проекта, который хотите запустить.
Подробнее о том, где и как выполняется проект.

Последнее редактирование:

Konrod_m

Client
Регистрация
18.09.2014
Сообщения
1 662
Благодарностей
919
Баллы
113
добрый день. спасибо за статью... без троллинга - чем этот метод облегчает-улучшает или упрощает работу с БД? все сводится к тем же select-insert..

В каких случаях удобнее пользоваться подобной схемой, а не готовым кубиком или просто через С#?
 
  • Спасибо
Реакции: seodamage

SERG454

Client
Регистрация
14.10.2021
Сообщения
144
Благодарностей
140
Баллы
43
Спасибо!
Если можно - пару примеров реализации запросов при "высокой нагрузке" общения с БД этой связкой , отличается ли чем тактика оптимизации нагрузки как при обычных методах , например просто запросами SQL?
 

radv

Client
Регистрация
11.05.2015
Сообщения
3 678
Благодарностей
1 860
Баллы
113
Спасибо за статью. Как раз обновляю знания по EF :az:
 

socsecret.ru

Client
Регистрация
30.09.2017
Сообщения
343
Благодарностей
207
Баллы
43
Неплохой объём работы, благодарю!
 

sw_sw

Client
Регистрация
24.02.2017
Сообщения
694
Благодарностей
277
Баллы
63
Добрый день!

Пример с INSERT смотрелся бы в статье еще лучше =)
 
  • Спасибо
Реакции: seodamage

Sherminator

Client
Регистрация
10.09.2021
Сообщения
997
Благодарностей
536
Баллы
93
добрый день. спасибо за статью... без троллинга - чем этот метод облегчает-улучшает или упрощает работу с БД? все сводится к тем же select-insert..

В каких случаях удобнее пользоваться подобной схемой, а не готовым кубиком или просто через С#?
Добрый, кубиками я к великому стыду вообще не пользуюсь, даже не знаю какой что делает, пишу исключительно на шарпе в связке с VS. Как пример, если использовать просто шарп то надо будет постоянно открывать соединение с бд, постоянно его закрывать, писать sql запросы длинной во весь экран, вы если посмотрите с какой легкостью я добавил данные в БД, то все поймете. Упрощение работы с БД заключается в более высоком уровне абстракции и отказе от SQL, так же ходят слухи что EF работает быстрее. Написанные один раз классы будут работать с любым провайдером, если вы решите с ms sql server на тот же постгрес перейти, то не надо будет код править.


Добрый день!

Пример с INSERT смотрелся бы в статье еще лучше =)

Добрый) insert там на скриншоте есть когда я данные в БД добавлял, подумал что этого хватит. Вот примеры


1) Пример простого INSERT-запроса для добавления записи в базу данных:
C#:
using (var context = new YourDbContext())
{
    var newRecord = new YourEntity()
    {
        Column1 = value1,
        Column2 = value2,
        Column3 = value3
    };

    context.YourEntities.Add(newRecord);
    context.SaveChanges();
}
2) Пример INSERT-запроса с использованием метода AddRange() для добавления нескольких записей в базу данных:
C#:
using (var context = new YourDbContext())
{
    var newRecords = new List<YourEntity>
    {
        new YourEntity { Column1 = value1, Column2 = value2 },
        new YourEntity { Column1 = value3, Column2 = value4 },
        new YourEntity { Column1 = value5, Column2 = value6 }
    };

    context.YourEntities.AddRange(newRecords);
    context.SaveChanges();
}
3) Пример INSERT-запроса с автоматическим созданием объекта сущности и сохранением изменений:
C#:
using (var context = new YourDbContext())
{
    var newRecord = context.YourEntities.Create();

    newRecord.Column1 = value1;
    newRecord.Column2 = value2;
    newRecord.Column3 = value3;

    context.YourEntities.Add(newRecord);
    context.SaveChanges();
}
Спасибо!
Если можно - пару примеров реализации запросов при "высокой нагрузке" общения с БД этой связкой , отличается ли чем тактика оптимизации нагрузки как при обычных методах , например просто запросами SQL?
Добрый вечер, при высокой нагрузке в Entity Framework используют такие фичи как lazy loading (отложенная загрузка) , Explicit Loading (явная загрузка) , ну и еще там есть асинхронные методы и проекции, в целом это все направлено на то, что бы лишние данные с базы не тянуть и не расходовать на это ресурсы.


1) Использование отложенной загрузки (Lazy Loading):
C#:
using (var context = new YourDbContext())
{
    var author = context.Authors.FirstOrDefault(a => a.AuthorId == 1);

    // При обращении к свойству Books, связанные книги автора будут загружены
    foreach (var book in author.Books)
    {
        Console.WriteLine(book.Title);
    }
}
2) Использование явной загрузки (Explicit Loading):
C#:
using (var context = new YourDbContext())
{
    var author = context.Authors.FirstOrDefault(a => a.AuthorId == 1);

    // Явно загружаем связанные книги автора
    context.Entry(author).Collection(a => a.Books).Load();

    // Обрабатываем загруженные книги
    foreach (var book in author.Books)
    {
        Console.WriteLine(book.Title);
    }
}
3) Использование проекций (Projections):
C#:
using (var context = new YourDbContext())
{
    var records = context.YourEntities
        .Where(e => e.Property == value)
        .Select(e => new { e.Column1, e.Column2 }) // Проецируем только необходимые свойства
        .ToList();

    // Выполняем операции с данными
}
4) Использование асинхронных запросов:
C#:
using (var context = new YourDbContext())
{
    var records = await context.YourEntities.ToListAsync();
    // Выполняем операции с данными
}
 

fridayman

Client
Регистрация
25.03.2018
Сообщения
167
Благодарностей
259
Баллы
63
Да, впечатляет подход. По верхушкам, конечно, но и тем не менее - концепты от экспертов всегда в цене.
 

Brabus_bots

Client
Регистрация
13.04.2019
Сообщения
656
Благодарностей
434
Баллы
63

radv

Client
Регистрация
11.05.2015
Сообщения
3 678
Благодарностей
1 860
Баллы
113
упростите свою работу с базами данных в ZennoPoster.
Несколько вопросов по работе с EF и переносом кода в зеннопостер
  • Как подключаться к уже готовой БД?
  • Как использовать подключение других баз (SQLite, MySql, PostgreSQL)?
  • Где создается файл фазы с которым работает?
 

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 444
Благодарностей
1 287
Баллы
113
1. На сколько быстра обратока миллиона строк, при поиске по нескольким фильтрам?
2. Как себя поведет такая база на 100 млн. строк?
3. Как работать с базой по удаленке?
 
  • Спасибо
Реакции: seodamage

Sherminator

Client
Регистрация
10.09.2021
Сообщения
997
Благодарностей
536
Баллы
93
Несколько вопросов по работе с EF и переносом кода в зеннопостер
  • Как подключаться к уже готовой БД?
  • Как использовать подключение других баз (SQLite, MySql, PostgreSQL)?
  • Где создается файл фазы с которым работает?
1) Использовать другую модель создания БД
2023-05-28_16-29-49.png
2) В статье про это написано, надо использовать дополнительные библиотек, на пример
107608


107609


3) В папке СУБД


1. На сколько быстра обратока миллиона строк, при поиске по нескольким фильтрам?
2. Как себя поведет такая база на 100 млн. строк?
3. Как работать с базой по удаленке?
Не знаю, не проводил таких тестов
 
  • Спасибо
Реакции: radv и Gunjubasik

radv

Client
Регистрация
11.05.2015
Сообщения
3 678
Благодарностей
1 860
Баллы
113
1) Использовать другую модель создания БД
Посмотреть вложение 107607
2) В статье про это написано, надо использовать дополнительные библиотек, на пример
Посмотреть вложение 107608

Посмотреть вложение 107609

3) В папке СУБД




Не знаю, не проводил таких тестов
А примеры кода для подключения в зенно можно? )

И как выбирать нужные из списка (а то их там очень много разных похожих, даже без Core), чтобы к зенке норм подключались?

Проблема в том, что они используют более новые версии NetFramework, чем в зенке.
 
Последнее редактирование:

Sherminator

Client
Регистрация
10.09.2021
Сообщения
997
Благодарностей
536
Баллы
93
А примеры кода для подключения в зенно можно? )

И как выбирать нужные из списка (а то их там очень много разных похожих, даже без Core), чтобы к зенке норм подключались?

Проблема в том, что они используют более новые версии NetFramework, чем в зенке.
Конкретно в зенке я не пробовал использовать другие СУБД кроме MsSqlServer, надо разбираться.
Либы нужны конкретно под .net Framework т.к зенка использует именно его. EF для .net Framework имеет максимальную версию 6.4.4 (это финалка под .нет фреймворк т.к фреймфорк больше не обновляется) и если доп либа требует более высокую версию EF то значит она не под .net framework
 
  • Спасибо
Реакции: radv

che100

Client
Регистрация
18.04.2017
Сообщения
808
Благодарностей
499
Баллы
63
Отличная работа. Жаль что за такие мало голосуют , предпочитая что-то мутное, размытое, или Как я сходил в туалет по большому с помощью ZennoPoster .
 
  • Спасибо
Реакции: djaga

Sherminator

Client
Регистрация
10.09.2021
Сообщения
997
Благодарностей
536
Баллы
93
Отличная работа. Жаль что за такие мало голосуют , предпочитая что-то мутное, размытое, или Как я сходил в туалет по большому с помощью ZennoPoster .
Сам в шоке, не мало времени потратил что бы додуматься как их подружить
 
  • Спасибо
Реакции: djaga и che100

demiddima

Client
Регистрация
06.06.2023
Сообщения
7
Благодарностей
0
Баллы
1
А примеры кода для подключения в зенно можно? )

И как выбирать нужные из списка (а то их там очень много разных похожих, даже без Core), чтобы к зенке норм подключались?

Проблема в том, что они используют более новые версии NetFramework, чем в зенке.
Приветствую. Нашли решения для подключения других СУБД? Пробую через рекомендованные библы, но пока не получается)
 

radv

Client
Регистрация
11.05.2015
Сообщения
3 678
Благодарностей
1 860
Баллы
113
Приветствую. Нашли решения для подключения других СУБД? Пробую через рекомендованные библы, но пока не получается)
Пока работаю с MySQL без Entity, написал свои методы для упрощения работы с добавлением/получением данных.
 
  • Спасибо
Реакции: demiddima

Sherminator

Client
Регистрация
10.09.2021
Сообщения
997
Благодарностей
536
Баллы
93
В другом проекте пост
Приветствую. Нашли решения для подключения других СУБД? Пробую через рекомендованные библы, но пока не получается)
В другом проекте постгри цеплял к EF, правда это .net mvc приложение было, но принцип оказался таким же, только строку подключения исправлял
 

demiddima

Client
Регистрация
06.06.2023
Сообщения
7
Благодарностей
0
Баллы
1
В другом проекте пост

В другом проекте постгри цеплял к EF, правда это .net mvc приложение было, но принцип оказался таким же, только строку подключения исправлял
Ну у меня пока не получается. Не коннектится. А вместе с MySql.Data.EntityFramework кучу других библиотек устанавливается.
118761


Ну и сам файл конфига тоже другой. Но вроде бы всё заменил на MySql. Пока не выходит)
118763
 

Sherminator

Client
Регистрация
10.09.2021
Сообщения
997
Благодарностей
536
Баллы
93
Ну у меня пока не получается. Не коннектится. А вместе с MySql.Data.EntityFramework кучу других библиотек устанавливается.
Посмотреть вложение 118761

Ну и сам файл конфига тоже другой. Но вроде бы всё заменил на MySql. Пока не выходит)
Посмотреть вложение 118763
Так надо строку подключения на прямую в контекст запердоливать, без файла конфига, даже если собираешься работать через студию, лучше так делать, там строку подключения из файла через жопу постоянно подтягивается, лучше её на прямую указывать

2024-03-04_10-49-25.png
 

demiddima

Client
Регистрация
06.06.2023
Сообщения
7
Благодарностей
0
Баллы
1
Так надо строку подключения на прямую в контекст запердоливать, без файла конфига, даже если собираешься работать через студию, лучше так делать, там строку подключения из файла через жопу постоянно подтягивается, лучше её на прямую указывать

Посмотреть вложение 118776
Да делал так, это просто когда начал тестить по разному и переделывать, не стал переносить. Блин, ну пока не получается... хер знает
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)