Kaynağa Gözat

rider + avalonia + mysql

Евгений Колесников 2 yıl önce
ebeveyn
işleme
ebb157bf72

+ 95 - 29
articles/cs_mysql_connection3.md

@@ -9,7 +9,7 @@
 * [Создание подключения к БД MySQL](#создание-подключения-к-бд-mysql)
 * [Получение данных с сервера](#получение-данных-с-сервера)
 
-Дальше мы продолжим разбор задания прошлогоднего демо-экзамена. 
+Дальше мы продолжим разбор задания одного из прошлых демо-экзаменов. 
 
 Базу мы развернули и данные в неё импортировали, теперь начнём разбор второй сессии: создание desktop-приложения.
 
@@ -41,7 +41,7 @@
 
 Благодаря этой технологии разработчики могут использовать язык программирования, с которым им удобно работать с базой данных, вместо написания операторов SQL или хранимых процедур. Это может значительно ускорить разработку приложений, особенно на начальном этапе. ORM также позволяет переключать приложение между различными реляционными базами данных. Например, приложение может быть переключено с MySQL на PostgreSQL с минимальными изменениями кода.
 
-В прошлом году мы использовали **.NET Framework**, но с этого года перейдем на **.NET Core**.
+Ранее мы использовали **.NET Framework** + **WPF**, но с этого года перейдем на **.NET Core** + **Avalonia**.
 
 **Во-первых**, **.NET Framework** работает только под ОС Windows и больше не поддерживается (последняя поддерживаемая версия C# - 4.7.2).
 
@@ -49,17 +49,62 @@
 
 **.NET Core** - кроссплатформенная библиотека, поддерживает последние версии языка и ORM EntityFramewokCore нормально работает с MySQL.
 
-Мы пока останемся на технологии **WPF**, т.е. ограничимся ОС Windows, но в перспективе перейдём и на Linux.
+**WPF** заменим на **Avalonia**, пока ограничимся ОС Windows, но в перспективе перейдём и на Linux/MacOS.
 
-Итак, создадим проект на C#, для рабочего стола, WPF, **.NET Core**
+В качестве **IDE** будем использовать **JetBarains Rider**. Продует платный. Теоретически для неё есть бесплатные образовательные лицензии, но нам они недоступны. Активируйте ключём (гуглится по запросу "rider activation key", ключи действуют год и могут быть отозваны, поэтому конкретный ключ не указываю).
 
-![](../img/cs001.png)
+## Установка Rider
 
-В *целевой платформе* укажите **.NET 5.0** (для Visual Studio 19 это последняя версия, для Visual Stidio 22 уже есть .NET 6)
+Ссылка для скачивания [Rider](https://www.jetbrains.com/ru-ru/rider/)
 
-В контекстном меню *зависимости* выберите "Управление пакетами NuGet" и установите пакеты "Microsoft.EntityFrameworkCore", "Microsoft.EntityFrameworkCore.Tools" и "Pomelo.EntityFrameworkCore.MySql"
+Установка Avalonia на Rider
 
-![](../img/cs002.png)
+1. Запустить собственно сам Rider
+
+1. В основном окне выбрать вкладку *Configure -> Plugins*
+
+    ![](../img/rider001.png)
+
+1. Установить AvaloniaRider (в строке поиска введите "avalonia")
+
+    ![](../img/rider002.png)
+
+    При установке может выдать сообщение, что плагин разработан не в JetBrains и использовать на свой страх - соглашаемся (Accept)
+
+1. После установки плагина перезагрузите IDE и установите шаблоны проектов для Avalonia. В консоли выполните команду: 
+
+    ```
+    dotnet new install Avalonia.Templates
+    ```
+
+    >Для .NET 6.0 и более ранних версий замените install на --install.
+    >Версию .NET можно узнать выполнив в консоли команду `dotnet --version`
+
+    Если шаблоны установлены нормально, то в окне создания нового проекта появится секция *Other*:
+
+    ![](../img/rider003.png)    
+
+## Создание проекта, подключение пакетов для работы с БД.
+
+Итак, создадим проект на C# по шаблону *Avalonia .NET Core App*
+
+В *контекстном меню* проекта выберите "Manage NuGet Packages"
+
+![](../img/rider004.png)
+
+* Установите пакет "Microsoft.EntityFrameworkCore.Design"
+
+    ![](../img/rider005.png)
+
+    >Версия пакета должна соответствовать версии .NET. У меня стоит 6-я версия, вам нужно смотреть командой `dotnet --version`
+
+* Установите пакет "MySql.EntityFrameworkCore"
+
+    ![](../img/rider006.png)
+
+    >Версия пакета должна соответствовать версии .NET.
+
+## Создание подключения к БД (контекст).
 
 Для подключения к базе данных нужно создать модели и контекст подключения (адрес сервера, название БД, логин и пароль). Тут есть два варианта:
 
@@ -67,12 +112,15 @@
 
 1. **DB First** (сначала база). В этом варианте база уже создана и нам нужен обратный процесс - [реконструировать](https://metanit.com/sharp/entityframeworkcore/1.3.php) модели и контекст по имеющейся БД. Мы будем использовать этот вариант.
 
-В **Visual Studio** откройте окно: *Вид -> Другие окна -> Консоль диспетчера пакетов*. И выполните в ней команду (естественно, вписав свои базы и пароли):
+В терминале (можно и в системной консоли, но обязательно в каталоге проекта) 
+
+![](../img/rider007.png)
+
+выполните команду (естественно, вписав свои базы и пароли):
 
 ```
-Scaffold-DbContext "server=kolei.ru;database=esmirnov;uid=esmirnov;password=111103;" Pomelo.EntityFrameworkCore.MySql -OutputDir Models -f
+dotnet ef dbcontext scaffold "server=kolei.ru;database=esmirnov;uid=esmirnov;password=111103;" MySql.EntityFrameworkCore -o esmirnov -f
 ```
-
 параметры команды:
 
 * "строка подключения": здесь вариант для MySQL
@@ -82,19 +130,15 @@ Scaffold-DbContext "server=kolei.ru;database=esmirnov;uid=esmirnov;password=1111
     - **uid**: логин пользователя (обычно то же, что и название БД, но если у вас свой сервер MySQL, то там вы рулите сами)
     - **password**: пароль пользователя
 
-* используемый провайдер БД (Pomelo.EntityFrameworkCore.MySql)
-
-* **-OutputDir "Название каталога"**: название каталога в вашем проекте, в котором будут созданы контекст и модели БД
-
-* **-f | -Force**: перезаписывать модели (при повторном запуске реконструирования)
+* используемый провайдер БД (MySql.EntityFrameworkCore)
 
-* **-Context "название класса"**: по-умолчанию при реконструировании создаётся класс контекста **"database"+Context**, т.е. при моих настройках получится **esmirnovContext**. Используя параметр **-Context** можно указать произвольное имя класса
+* **-o "Название каталога"**: название каталога в вашем проекте, в котором будут созданы контекст и модели БД
 
-* **-Tables "список таблиц, разделённый запятыми"**, например `-Tables Product,Material,ProductType,MaterialType,ProductMaterial`: список таблиц для реконструирования. В рамках демо экзамена использовать не нужно (если у вас не осталось таблиц импорта в базе данных, иначе фреймворк может выдать ошибки, что в таблице нет первичного ключа), но при выполнении лабораторных работ понадобится, т.к. у вас в одной физической БД будет несколько логических: разные варианты заданий + таблицы для курсового проекта.
+* **-f**: перезаписывать модели (при повторном запуске команды)
 
-Эта команда создает контекст подключения (параметры в кавычках) к провайдеру (второй параметр) MySQL и модели сущностей в папке `Models` вашего проекта.
+Эта команда создает контекст подключения (параметры в кавычках) к провайдеру (второй параметр) MySQL и модели сущностей в папке `esmirnov` вашего проекта.
 
-![](../img/cs003.png)
+![](../img/rider008.png)
 
 Например, рассмотрим таблицу **Product**:
 
@@ -103,31 +147,53 @@ public partial class Product
 {
     public Product()
     {
+        ProductCostHistories = new HashSet<ProductCostHistory>();
         ProductMaterials = new HashSet<ProductMaterial>();
+        ProductSales = new HashSet<ProductSale>();
     }
 
     public int Id { get; set; }
-    public string Title { get; set; }
-    public int? ProductTypeId { get; set; }
-    public string ArticleNumber { get; set; }
-    public string Description { get; set; }
-    public string Image { get; set; }
+    public string Title { get; set; } = null!;
+    public int ProductTypeId { get; set; }
+    public string ArticleNumber { get; set; } = null!;
+    public string? Description { get; set; }
+    public string? Image { get; set; }
     public int? ProductionPersonCount { get; set; }
     public int? ProductionWorkshopNumber { get; set; }
     public decimal MinCostForAgent { get; set; }
 
-    public virtual ProductType ProductType { get; set; }
+    public virtual ProductType ProductType { get; set; } = null!;
+    public virtual ICollection<ProductCostHistory> ProductCostHistories { get; set; }
     public virtual ICollection<ProductMaterial> ProductMaterials { get; set; }
+    public virtual ICollection<ProductSale> ProductSales { get; set; }
 }
 ```
 
-1. Для всех полей таблицы созданы свойства класса (*Id*, *Title*...), причём необязательные поля имеют "нуллабельные" типы (**int? ProductTypeId**).
-2. Для связей сделаны виртуальные свойства или коллекции (в зависимости от направленности связи). 
+1. Для всех полей таблицы созданы свойства класса (*Id*, *Title*...), причём необязательные поля имеют "нуллабельные" типы (**int? ProductionPersonCount**).
+1. Для связей созданы виртуальные свойства или коллекции (в зависимости от направленности связи). 
 
     * **virtual ProductType ProductType** - тип продукции (ссылка на словарь), отношение много (продуктов) к одному (типу продукта)
     * **virtual ICollection<ProductMaterial> ProductMaterials** - материалы продукта - коллекция (список) материалов, используемых в этом продукте. Отношение один (продукт) ко многим (материалам продукта) 
 
-# Получение данных с сервера.
+## Получение данных с сервера и вывод на экран.
+
+**DataGrid** в **Avalonia** не установлен по умолчанию. Установить можно двумя вариантами:
+
+* выполнив команду `dotnet add package Avalonia.Controls.DataGrid`. Тут может возникнуть ситуация, когда версия **DataGrid** больше чем версия **Avalonia**. В этом случае проект не *соберется*. Удалите пакет командой `dotnet remove package Avalonia.Controls.DataGrid` и воспользуйтесь вторым вариантом
+
+* Добавить ссылку в файл проекта:
+
+    1. Переключите *Explorer* в режим *File System*:
+
+        ![](../img/rider009.png) 
+
+    1. Откройте файл проекта *.csproj, найдите строчку `<PackageReference Include="Avalonia" Version="11.0.2" />` (версия у вас может быть другая)
+
+    1. Добавьте следующей строкой пакет `<PackageReference Include="Avalonia.Controls.DataGrid" Version="11.0.2" />`
+
+        ![](../img/rider010.png)
+
+        >При редактировании версии пакета можно нажать комбинацию клавишь `Ctrl+Пробел` и выйдет подсказка с возможными вариантами версий
 
 Для демонстрации работы используем прошлогоднюю [заготовку](https://github.com/kolei/OAP/blob/master/articles/wpf_template.md) - вывод в DBGrid
 

BIN
img/cs001.png


BIN
img/cs002.png


BIN
img/cs003.png


BIN
img/rider001.png


BIN
img/rider002.png


BIN
img/rider003.png


BIN
img/rider004.png


BIN
img/rider005.png


BIN
img/rider006.png


BIN
img/rider007.png


BIN
img/rider008.png


BIN
img/rider009.png


BIN
img/rider010.png