From 17db1218cc1ead685e1b4a7342e9e48287e8008a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=A5=D0=B0=D1=80=D1=87=D0=B5=D0=BD=D0=BA=D0=BE=20=D0=92?=
 =?UTF-8?q?=D0=BB=D0=B0=D0=B4=D0=B8=D0=BC=D0=B8=D1=80?=
 <vv.kharchenko@autodrilling.ru>
Date: Thu, 16 Dec 2021 16:00:47 +0500
Subject: [PATCH] CS2-133: Removed permission mask logic from permissions

---
 ...missionRoleDto.cs => PermissionBaseDto.cs} |    2 +-
 AsbCloudApp/Services/IUserRoleService.cs      |    2 +-
 AsbCloudApp/Services/IUserService.cs          |    2 +-
 ...movedIdFromPermissionRelations.Designer.cs | 2969 +++++++++++++++++
 ...072650_RemovedIdFromPermissionRelations.cs |   35 +
 .../AsbCloudDbContextModelSnapshot.cs         |   11 +-
 .../Model/RelationUserRolePermission.cs       |    4 -
 AsbCloudDb/Model/RelationUserUserRole.cs      |    4 -
 .../Services/UserRoleService.cs               |   11 +-
 .../Services/UserService.cs                   |    5 +-
 .../Controllers/AdminPermissionController.cs  |    1 +
 .../Middlewares/PermissionsMiddlware.cs       |    5 +-
 AsbCloudWebApi/PermissionAttribute.cs         |    2 -
 ConsoleApp1/Program.cs                        |    2 +-
 14 files changed, 3018 insertions(+), 37 deletions(-)
 rename AsbCloudApp/Data/{PermissionRoleDto.cs => PermissionBaseDto.cs} (69%)
 create mode 100644 AsbCloudDb/Migrations/20211216072650_RemovedIdFromPermissionRelations.Designer.cs
 create mode 100644 AsbCloudDb/Migrations/20211216072650_RemovedIdFromPermissionRelations.cs

diff --git a/AsbCloudApp/Data/PermissionRoleDto.cs b/AsbCloudApp/Data/PermissionBaseDto.cs
similarity index 69%
rename from AsbCloudApp/Data/PermissionRoleDto.cs
rename to AsbCloudApp/Data/PermissionBaseDto.cs
index c825b2a2..a309200c 100644
--- a/AsbCloudApp/Data/PermissionRoleDto.cs
+++ b/AsbCloudApp/Data/PermissionBaseDto.cs
@@ -3,6 +3,6 @@
     public class PermissionBaseDto
     {
         public int Id { get; set; }
-        public string PermissionName { get; set; }
+        public string Name { get; set; }
     }
 }
\ No newline at end of file
diff --git a/AsbCloudApp/Services/IUserRoleService.cs b/AsbCloudApp/Services/IUserRoleService.cs
index 7e978867..5a6ba64a 100644
--- a/AsbCloudApp/Services/IUserRoleService.cs
+++ b/AsbCloudApp/Services/IUserRoleService.cs
@@ -10,6 +10,6 @@ namespace AsbCloudApp.Services
         Task<UserRoleDto> GetByNameAsync(string name, CancellationToken token = default);
         List<UserRoleDto> GetNestedById(int id, int counter = 10);
         IEnumerable<PermissionBaseDto> GetNestedPermissions(IEnumerable<UserRoleDto> roles);
-        bool HasPermission(IEnumerable<int> rolesIds, string permissionName, int permissionMask = 0);
+        bool HasPermission(IEnumerable<int> rolesIds, string permissionName);
     }
 }
\ No newline at end of file
diff --git a/AsbCloudApp/Services/IUserService.cs b/AsbCloudApp/Services/IUserService.cs
index 9534ecc5..0abc8606 100644
--- a/AsbCloudApp/Services/IUserService.cs
+++ b/AsbCloudApp/Services/IUserService.cs
@@ -10,6 +10,6 @@ namespace AsbCloudApp.Services
         IEnumerable<UserRoleDto> GetRolesByIdUser(int idUser);
         bool HasAnyRoleOf(int idUser, IEnumerable<string> roleNames);
         bool HasAnyRoleOf(int idUser, IEnumerable<int> roleIds);
-        public bool HasPermission(int idUser, string permissionName, int permissionMask = 0);
+        public bool HasPermission(int idUser, string permissionName);
     }
 }
diff --git a/AsbCloudDb/Migrations/20211216072650_RemovedIdFromPermissionRelations.Designer.cs b/AsbCloudDb/Migrations/20211216072650_RemovedIdFromPermissionRelations.Designer.cs
new file mode 100644
index 00000000..b29a445b
--- /dev/null
+++ b/AsbCloudDb/Migrations/20211216072650_RemovedIdFromPermissionRelations.Designer.cs
@@ -0,0 +1,2969 @@
+// <auto-generated />
+using System;
+using System.Collections.Generic;
+using AsbCloudDb.Model;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+
+namespace AsbCloudDb.Migrations
+{
+    [DbContext(typeof(AsbCloudDbContext))]
+    [Migration("20211216072650_RemovedIdFromPermissionRelations")]
+    partial class RemovedIdFromPermissionRelations
+    {
+        protected override void BuildTargetModel(ModelBuilder modelBuilder)
+        {
+#pragma warning disable 612, 618
+            modelBuilder
+                .HasPostgresExtension("adminpack")
+                .HasAnnotation("Relational:Collation", "Russian_Russia.1251")
+                .HasAnnotation("Relational:MaxIdentifierLength", 63)
+                .HasAnnotation("ProductVersion", "5.0.10")
+                .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+            modelBuilder.Entity("AsbCloudDb.Model.Cluster", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasColumnName("id")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Caption")
+                        .HasMaxLength(255)
+                        .HasColumnType("character varying(255)")
+                        .HasColumnName("caption")
+                        .HasComment("Название");
+
+                    b.Property<int?>("IdDeposit")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_deposit");
+
+                    b.Property<double?>("Latitude")
+                        .HasColumnType("double precision")
+                        .HasColumnName("latitude");
+
+                    b.Property<double?>("Longitude")
+                        .HasColumnType("double precision")
+                        .HasColumnName("longitude");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("IdDeposit");
+
+                    b.ToTable("t_cluster");
+
+                    b
+                        .HasComment("Кусты");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.Company", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasColumnName("id")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Caption")
+                        .HasMaxLength(255)
+                        .HasColumnType("character varying(255)")
+                        .HasColumnName("caption");
+
+                    b.Property<int>("IdCompanyType")
+                        .HasMaxLength(255)
+                        .HasColumnType("integer")
+                        .HasColumnName("id_company_type")
+                        .HasComment("вид деятельности");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("IdCompanyType");
+
+                    b.ToTable("t_company");
+
+                    b.HasData(
+                        new
+                        {
+                            Id = 1,
+                            Caption = "ООО \"АСБ\"",
+                            IdCompanyType = 3
+                        });
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.CompanyType", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasColumnName("id")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Caption")
+                        .HasMaxLength(255)
+                        .HasColumnType("character varying(255)")
+                        .HasColumnName("caption");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("t_company_type");
+
+                    b.HasData(
+                        new
+                        {
+                            Id = 1,
+                            Caption = "Недрапользователь"
+                        },
+                        new
+                        {
+                            Id = 2,
+                            Caption = "Буровой подрядчик"
+                        },
+                        new
+                        {
+                            Id = 3,
+                            Caption = "Сервис автоматизации бурения"
+                        });
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.Deposit", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasColumnName("id")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Caption")
+                        .HasMaxLength(255)
+                        .HasColumnType("character varying(255)")
+                        .HasColumnName("caption");
+
+                    b.Property<double?>("Latitude")
+                        .HasColumnType("double precision")
+                        .HasColumnName("latitude");
+
+                    b.Property<double?>("Longitude")
+                        .HasColumnType("double precision")
+                        .HasColumnName("longitude");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("t_deposit");
+
+                    b
+                        .HasComment("Месторождение");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.DrillFlowChart", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasColumnName("id")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<double>("AxialLoadMax")
+                        .HasColumnType("double precision")
+                        .HasColumnName("axial_load_max")
+                        .HasComment("Максимальная нагрузка");
+
+                    b.Property<double>("AxialLoadMin")
+                        .HasColumnType("double precision")
+                        .HasColumnName("axial_load_min")
+                        .HasComment("Минимальная нагрузка");
+
+                    b.Property<double>("DepthEnd")
+                        .HasColumnType("double precision")
+                        .HasColumnName("depth_end")
+                        .HasComment("Глубина окончания интервала");
+
+                    b.Property<double>("DepthStart")
+                        .HasColumnType("double precision")
+                        .HasColumnName("depth_start")
+                        .HasComment("Стартовая глубина");
+
+                    b.Property<double>("FlowMax")
+                        .HasColumnType("double precision")
+                        .HasColumnName("flow_max")
+                        .HasComment("Максимальный расход");
+
+                    b.Property<double>("FlowMin")
+                        .HasColumnType("double precision")
+                        .HasColumnName("flow_min")
+                        .HasComment("Минимальный расход");
+
+                    b.Property<int>("IdWell")
+                        .HasColumnType("integer")
+                        .HasColumnName("well_id")
+                        .HasComment("Id скважины");
+
+                    b.Property<int>("IdWellOperationCategory")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_operation_category")
+                        .HasComment("Id типа операции");
+
+                    b.Property<DateTime>("LastUpdate")
+                        .HasColumnType("timestamp without time zone")
+                        .HasColumnName("last_update")
+                        .HasComment("Дата последнего изменения");
+
+                    b.Property<double>("PressureMax")
+                        .HasColumnType("double precision")
+                        .HasColumnName("pressure_max")
+                        .HasComment("Максимальное давление");
+
+                    b.Property<double>("PressureMin")
+                        .HasColumnType("double precision")
+                        .HasColumnName("pressure_min")
+                        .HasComment("Минимальное давление");
+
+                    b.Property<double>("RotorSpeedMax")
+                        .HasColumnType("double precision")
+                        .HasColumnName("rotor_speed_max")
+                        .HasComment("Максимальные обороты на ВСП");
+
+                    b.Property<double>("RotorSpeedMin")
+                        .HasColumnType("double precision")
+                        .HasColumnName("rotor_speed_min")
+                        .HasComment("Минимальные обороты на ВСП");
+
+                    b.Property<double>("RotorTorqueMax")
+                        .HasColumnType("double precision")
+                        .HasColumnName("rotor_torque_max")
+                        .HasComment("Максимальный момент на ВСП");
+
+                    b.Property<double>("RotorTorqueMin")
+                        .HasColumnType("double precision")
+                        .HasColumnName("rotor_torque_min")
+                        .HasComment("Минимальный момент на ВСП");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("IdWell");
+
+                    b.HasIndex("IdWellOperationCategory");
+
+                    b.ToTable("t_drill_flow_chart");
+
+                    b
+                        .HasComment("Параметры корридоров бурения (диапазоны параметров бурения)");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.DrillParams", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasColumnName("id")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<double>("AxialLoadAvg")
+                        .HasColumnType("double precision")
+                        .HasColumnName("axial_load_avg")
+                        .HasComment("Средняя нагрузка");
+
+                    b.Property<double>("AxialLoadMax")
+                        .HasColumnType("double precision")
+                        .HasColumnName("axial_load_max")
+                        .HasComment("Максимальная нагрузка");
+
+                    b.Property<double>("AxialLoadMin")
+                        .HasColumnType("double precision")
+                        .HasColumnName("axial_load_min")
+                        .HasComment("Минимальная нагрузка");
+
+                    b.Property<double>("DepthEnd")
+                        .HasColumnType("double precision")
+                        .HasColumnName("depth_end")
+                        .HasComment("Глубина окончания интервала");
+
+                    b.Property<double>("DepthStart")
+                        .HasColumnType("double precision")
+                        .HasColumnName("depth_start")
+                        .HasComment("Стартовая глубина");
+
+                    b.Property<double>("FlowAvg")
+                        .HasColumnType("double precision")
+                        .HasColumnName("flow_avg")
+                        .HasComment("Средний расход");
+
+                    b.Property<double>("FlowMax")
+                        .HasColumnType("double precision")
+                        .HasColumnName("flow_max")
+                        .HasComment("Максимальный расход");
+
+                    b.Property<double>("FlowMin")
+                        .HasColumnType("double precision")
+                        .HasColumnName("flow_min")
+                        .HasComment("Минимальный расход");
+
+                    b.Property<int>("IdWell")
+                        .HasColumnType("integer")
+                        .HasColumnName("well_id")
+                        .HasComment("Id скважины");
+
+                    b.Property<int>("IdWellSectionType")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_wellsection_type")
+                        .HasComment("Id с типом секции скважины");
+
+                    b.Property<double>("PressureAvg")
+                        .HasColumnType("double precision")
+                        .HasColumnName("pressure_avg")
+                        .HasComment("Среднее давление");
+
+                    b.Property<double>("PressureMax")
+                        .HasColumnType("double precision")
+                        .HasColumnName("pressure_max")
+                        .HasComment("Максимальное давление");
+
+                    b.Property<double>("PressureMin")
+                        .HasColumnType("double precision")
+                        .HasColumnName("pressure_min")
+                        .HasComment("Минимальное давление");
+
+                    b.Property<double>("RotorSpeedAvg")
+                        .HasColumnType("double precision")
+                        .HasColumnName("rotor_speed_avg")
+                        .HasComment("Средние обороты на ВСП");
+
+                    b.Property<double>("RotorSpeedMax")
+                        .HasColumnType("double precision")
+                        .HasColumnName("rotor_speed_max")
+                        .HasComment("Максимальные обороты на ВСП");
+
+                    b.Property<double>("RotorSpeedMin")
+                        .HasColumnType("double precision")
+                        .HasColumnName("rotor_speed_min")
+                        .HasComment("Минимальные обороты на ВСП");
+
+                    b.Property<double>("RotorTorqueAvg")
+                        .HasColumnType("double precision")
+                        .HasColumnName("rotor_torque_avg")
+                        .HasComment("Средний момент на ВСП");
+
+                    b.Property<double>("RotorTorqueMax")
+                        .HasColumnType("double precision")
+                        .HasColumnName("rotor_torque_max")
+                        .HasComment("Максимальный момент на ВСП");
+
+                    b.Property<double>("RotorTorqueMin")
+                        .HasColumnType("double precision")
+                        .HasColumnName("rotor_torque_min")
+                        .HasComment("Минимальный момент на ВСП");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("IdWell");
+
+                    b.HasIndex("IdWellSectionType");
+
+                    b.ToTable("t_drill_params");
+
+                    b
+                        .HasComment("Режим бурения в секции (диапазоны параметров бурения)");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.FileCategory", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasColumnName("id")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Name")
+                        .HasColumnType("text")
+                        .HasColumnName("name")
+                        .HasComment("Название категории");
+
+                    b.Property<string>("ShortName")
+                        .HasColumnType("text")
+                        .HasColumnName("short_name")
+                        .HasComment("Короткое название категории");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("t_file_category");
+
+                    b
+                        .HasComment("Категории файлов");
+
+                    b.HasData(
+                        new
+                        {
+                            Id = 1,
+                            Name = "Растворный сервис",
+                            ShortName = "fluidService"
+                        },
+                        new
+                        {
+                            Id = 2,
+                            Name = "Цементирование",
+                            ShortName = "cement"
+                        },
+                        new
+                        {
+                            Id = 3,
+                            Name = "ННБ",
+                            ShortName = "nnb"
+                        },
+                        new
+                        {
+                            Id = 4,
+                            Name = "ГТИ",
+                            ShortName = "gti"
+                        },
+                        new
+                        {
+                            Id = 5,
+                            Name = "Документы по скважине",
+                            ShortName = "wellDocuments"
+                        },
+                        new
+                        {
+                            Id = 6,
+                            Name = "Супервайзер",
+                            ShortName = "supervisor"
+                        },
+                        new
+                        {
+                            Id = 7,
+                            Name = "Мастер",
+                            ShortName = "master"
+                        },
+                        new
+                        {
+                            Id = 8,
+                            Name = "Последний замер бурового раствора ПЛАН",
+                            ShortName = "fluidPlanLastData"
+                        },
+                        new
+                        {
+                            Id = 9,
+                            Name = "Последний замер бурового раствора ФАКТ",
+                            ShortName = "fluidFactLastData"
+                        },
+                        new
+                        {
+                            Id = 10,
+                            Name = "Последние данные Шламограммы",
+                            ShortName = "mudLastData"
+                        },
+                        new
+                        {
+                            Id = 11,
+                            Name = "Последние данные ННБ",
+                            ShortName = "nnbLastData"
+                        },
+                        new
+                        {
+                            Id = 12,
+                            Name = "Рапорт",
+                            ShortName = "report"
+                        },
+                        new
+                        {
+                            Id = 13,
+                            Name = "Программа бурения, части",
+                            ShortName = "ПБч"
+                        },
+                        new
+                        {
+                            Id = 14,
+                            Name = "Программа бурения",
+                            ShortName = "ПБ"
+                        });
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.FileInfo", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasColumnName("id")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<int?>("IdAuthor")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_author")
+                        .HasComment("Id пользователя, загрузившего файл");
+
+                    b.Property<int>("IdCategory")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_category")
+                        .HasComment("id категории файла");
+
+                    b.Property<int>("IdWell")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_well")
+                        .HasComment("id скважины");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("boolean")
+                        .HasColumnName("is_deleted")
+                        .HasComment("Удален ли файл");
+
+                    b.Property<string>("Name")
+                        .HasColumnType("text")
+                        .HasColumnName("name")
+                        .HasComment("Название файла");
+
+                    b.Property<FilePublishInfo>("PublishInfo")
+                        .HasColumnType("jsonb")
+                        .HasColumnName("publish_info")
+                        .HasComment("Информация о файле в облаке");
+
+                    b.Property<long>("Size")
+                        .HasColumnType("bigint")
+                        .HasColumnName("file_size")
+                        .HasComment("Размер файла");
+
+                    b.Property<DateTime>("UploadDate")
+                        .HasColumnType("timestamp with time zone")
+                        .HasColumnName("date");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("IdAuthor");
+
+                    b.HasIndex("IdCategory");
+
+                    b.HasIndex("IdWell");
+
+                    b.ToTable("t_file_info");
+
+                    b
+                        .HasComment("Файлы всех категорий");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.FileMark", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasColumnName("id")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Comment")
+                        .HasMaxLength(255)
+                        .HasColumnType("character varying(255)")
+                        .HasColumnName("comment")
+                        .HasComment("Комментарий");
+
+                    b.Property<DateTime>("DateCreated")
+                        .HasColumnType("timestamp without time zone")
+                        .HasColumnName("date_created")
+                        .HasComment("Дата совершенного действия");
+
+                    b.Property<int>("IdFile")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_file")
+                        .HasComment("id файла");
+
+                    b.Property<int>("IdMarkType")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_mark_type")
+                        .HasComment("0 - Согласован");
+
+                    b.Property<int>("IdUser")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_user")
+                        .HasComment("id пользователя");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("boolean")
+                        .HasColumnName("is_deleted")
+                        .HasComment("Помечен ли файл как удаленный");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("IdFile");
+
+                    b.HasIndex("IdUser");
+
+                    b.ToTable("t_file_mark");
+
+                    b
+                        .HasComment("Действия с файлами.");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.Measure", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasColumnName("id")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<Dictionary<string, object>>("Data")
+                        .HasColumnType("jsonb")
+                        .HasColumnName("data")
+                        .HasComment("Данные таблицы последних данных");
+
+                    b.Property<int>("IdCategory")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_category")
+                        .HasComment("id категории");
+
+                    b.Property<int>("IdWell")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_well")
+                        .HasComment("id скважины");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("boolean")
+                        .HasColumnName("is_deleted")
+                        .HasComment("Пометка удаленным");
+
+                    b.Property<DateTime>("Timestamp")
+                        .HasColumnType("timestamp without time zone")
+                        .HasColumnName("timestamp")
+                        .HasComment("время добавления");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("IdCategory");
+
+                    b.HasIndex("IdWell");
+
+                    b.ToTable("t_measure");
+
+                    b
+                        .HasComment("Таблица c данными для вкладки 'Последние данные'");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.MeasureCategory", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasColumnName("id")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Name")
+                        .HasColumnType("text")
+                        .HasColumnName("name")
+                        .HasComment("Название категории");
+
+                    b.Property<string>("ShortName")
+                        .HasColumnType("text")
+                        .HasColumnName("short_name")
+                        .HasComment("Короткое название категории");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("t_measure_category");
+
+                    b
+                        .HasComment("Категория последних данных");
+
+                    b.HasData(
+                        new
+                        {
+                            Id = 1,
+                            Name = "Показатели бурового раствора",
+                            ShortName = "Раствор"
+                        },
+                        new
+                        {
+                            Id = 2,
+                            Name = "Шламограмма",
+                            ShortName = "Шламограмма"
+                        },
+                        new
+                        {
+                            Id = 3,
+                            Name = "ННБ",
+                            ShortName = "ННБ"
+                        });
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.Permission", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasColumnName("id")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Description")
+                        .HasMaxLength(255)
+                        .HasColumnType("character varying(255)")
+                        .HasColumnName("description")
+                        .HasComment("Краткое описание");
+
+                    b.Property<string>("Name")
+                        .HasMaxLength(255)
+                        .HasColumnType("character varying(255)")
+                        .HasColumnName("name")
+                        .HasComment("Название");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("t_permission");
+
+                    b
+                        .HasComment("Разрешения на доступ к данным");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.RelationCompanyWell", b =>
+                {
+                    b.Property<int>("IdCompany")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_company");
+
+                    b.Property<int>("IdWell")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_well");
+
+                    b.HasKey("IdCompany", "IdWell");
+
+                    b.HasIndex("IdWell");
+
+                    b.ToTable("t_relation_company_well");
+
+                    b
+                        .HasComment("отношение скважин и компаний");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.RelationUserRolePermission", b =>
+                {
+                    b.Property<int>("IdUserRole")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_user_role");
+
+                    b.Property<int>("IdPermission")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_permission");
+
+                    b.HasKey("IdUserRole", "IdPermission");
+
+                    b.HasIndex("IdPermission");
+
+                    b.ToTable("t_relation_user_role_permission");
+
+                    b
+                        .HasComment("Отношение ролей пользователей и разрешений доступа");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.RelationUserUserRole", b =>
+                {
+                    b.Property<int>("IdUser")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_user");
+
+                    b.Property<int>("IdUserRole")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_user_role");
+
+                    b.HasKey("IdUser", "IdUserRole");
+
+                    b.HasIndex("IdUserRole");
+
+                    b.ToTable("t_relation_user_user_role");
+
+                    b
+                        .HasComment("Отношение пользователей и ролей");
+
+                    b.HasData(
+                        new
+                        {
+                            IdUser = 1,
+                            IdUserRole = 2
+                        });
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.ReportProperty", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasColumnName("id")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<DateTimeOffset>("Begin")
+                        .HasColumnType("timestamp with time zone")
+                        .HasColumnName("begin");
+
+                    b.Property<DateTimeOffset>("End")
+                        .HasColumnType("timestamp with time zone")
+                        .HasColumnName("end")
+                        .HasComment("timestamp with time zone");
+
+                    b.Property<int>("Format")
+                        .HasColumnType("integer")
+                        .HasColumnName("format")
+                        .HasComment("Формат отчета");
+
+                    b.Property<int>("IdFile")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_file")
+                        .HasComment("id файла-родителя");
+
+                    b.Property<int>("IdWell")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_well")
+                        .HasComment("id скважины");
+
+                    b.Property<int>("Step")
+                        .HasColumnType("integer")
+                        .HasColumnName("step")
+                        .HasComment("размер шага в секундах");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("IdFile");
+
+                    b.HasIndex("IdWell");
+
+                    b.ToTable("t_report_property");
+
+                    b
+                        .HasComment("Отчеты с данными по буровым");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.SetpointsRequest", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasColumnName("id")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Comment")
+                        .HasColumnType("text")
+                        .HasColumnName("comment")
+                        .HasComment("комментарий для оператора");
+
+                    b.Property<int>("IdAuthor")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_author")
+                        .HasComment("Id пользователя, загрузившего файл");
+
+                    b.Property<int>("IdState")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_state")
+                        .HasComment("0: неизвестно, 1:ожидает отправки, 2: отправлено, 3: принято оператором, 4: отклонено оператором, 5: устарело");
+
+                    b.Property<int>("IdWell")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_well")
+                        .HasComment("id скважины");
+
+                    b.Property<int>("ObsolescenceSec")
+                        .HasColumnType("integer")
+                        .HasColumnName("obsolescence")
+                        .HasComment("сек. до устаревания");
+
+                    b.Property<Dictionary<string, double>>("Setpoints")
+                        .HasColumnType("jsonb")
+                        .HasColumnName("setpoint_set")
+                        .HasComment("Набор уставок");
+
+                    b.Property<DateTime>("UploadDate")
+                        .HasColumnType("timestamp with time zone")
+                        .HasColumnName("date");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("IdAuthor");
+
+                    b.HasIndex("IdWell");
+
+                    b.ToTable("t_setpoints_rquest");
+
+                    b
+                        .HasComment("Запросы на изменение уставок панели оператора");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.Telemetry", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasColumnName("id")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<TelemetryInfo>("Info")
+                        .HasColumnType("jsonb")
+                        .HasColumnName("info")
+                        .HasComment("Информация с панели о скважине");
+
+                    b.Property<string>("RemoteUid")
+                        .HasColumnType("text")
+                        .HasColumnName("remote_uid")
+                        .HasComment("Идентификатор передающего устройства. Может повторяться в списке, так как комплекты оборудования переезжают от скв. к скв.");
+
+                    b.Property<TelemetryTimeZone>("TelemetryTimeZone")
+                        .HasColumnType("jsonb")
+                        .HasColumnName("timezone")
+                        .HasComment("Смещение часового пояса от UTC");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex(new[] { "RemoteUid" }, "t_telemetry_remote_uid_index");
+
+                    b.ToTable("t_telemetry");
+
+                    b
+                        .HasComment("таблица привязки телеметрии от комплектов к конкретной скважине.");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.TelemetryAnalysis", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasColumnName("id")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<int>("DurationSec")
+                        .HasColumnType("integer")
+                        .HasColumnName("duration_sec")
+                        .HasComment("Кол-во секунд после предыдущей операции");
+
+                    b.Property<int>("IdOperation")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_operation");
+
+                    b.Property<int>("IdTelemetry")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_telemetry");
+
+                    b.Property<bool>("IsBitPositionDecreasing")
+                        .HasColumnType("boolean")
+                        .HasColumnName("is_bit_position_decreasing")
+                        .HasComment("Долото поднимается");
+
+                    b.Property<bool>("IsBitPositionIncreasing")
+                        .HasColumnType("boolean")
+                        .HasColumnName("is_bit_position_increasing")
+                        .HasComment("Долото спускается");
+
+                    b.Property<bool>("IsBitPositionLt20")
+                        .HasColumnType("boolean")
+                        .HasColumnName("is_bit_posision_lt_20")
+                        .HasComment("Положение долота меньше 20м");
+
+                    b.Property<bool>("IsBlockPositionDecreasing")
+                        .HasColumnType("boolean")
+                        .HasColumnName("is_block_posision_decresing")
+                        .HasComment("Талевый блок поднимается");
+
+                    b.Property<bool>("IsBlockPositionIncreasing")
+                        .HasColumnType("boolean")
+                        .HasColumnName("is_block_posision_incresing")
+                        .HasComment("Талевый блок спускается");
+
+                    b.Property<bool>("IsHookWeightLt3")
+                        .HasColumnType("boolean")
+                        .HasColumnName("is_hook_weight_lt_3")
+                        .HasComment("Вес на крюке менее 3т");
+
+                    b.Property<bool>("IsHookWeightNotChanges")
+                        .HasColumnType("boolean")
+                        .HasColumnName("is_hook_weight_not_changes")
+                        .HasComment("Вес на крюке не меняется");
+
+                    b.Property<bool>("IsPressureGt20")
+                        .HasColumnType("boolean")
+                        .HasColumnName("is_pressure_gt_20")
+                        .HasComment("Давоение более 20");
+
+                    b.Property<bool>("IsPressureLt20")
+                        .HasColumnType("boolean")
+                        .HasColumnName("is_pressure_lt_20")
+                        .HasComment("Давление менее 20");
+
+                    b.Property<bool>("IsRotorSpeedGt5")
+                        .HasColumnType("boolean")
+                        .HasColumnName("is_rotor_speed_gt_3")
+                        .HasComment("Обороты ротора выше 3");
+
+                    b.Property<bool>("IsRotorSpeedLt5")
+                        .HasColumnType("boolean")
+                        .HasColumnName("is_rotor_speed_lt_3")
+                        .HasComment("Обороты ротора ниже 3");
+
+                    b.Property<bool>("IsWellDepthDecreasing")
+                        .HasColumnType("boolean")
+                        .HasColumnName("is_well_depth_decreasing")
+                        .HasComment("Глубина забоя не увеличивается");
+
+                    b.Property<bool>("IsWellDepthIncreasing")
+                        .HasColumnType("boolean")
+                        .HasColumnName("is_well_depth_increasing")
+                        .HasComment("Глубина забоя увеличивается");
+
+                    b.Property<double?>("OperationEndDepth")
+                        .HasColumnType("double precision")
+                        .HasColumnName("operation_end_depth")
+                        .HasComment("Глубина, на которой закончилась операция");
+
+                    b.Property<double?>("OperationStartDepth")
+                        .HasColumnType("double precision")
+                        .HasColumnName("operation_start_depth")
+                        .HasComment("Глубина, на которой началась операция");
+
+                    b.Property<long>("UnixDate")
+                        .HasColumnType("bigint")
+                        .HasColumnName("unix_date")
+                        .HasComment("Unix timestamp для Linq запросов с вычислением дат");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("IdOperation");
+
+                    b.HasIndex("IdTelemetry");
+
+                    b.ToTable("t_telemetry_analysis");
+
+                    b
+                        .HasComment("События на скважине");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaub", b =>
+                {
+                    b.Property<int>("IdTelemetry")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_telemetry");
+
+                    b.Property<DateTime>("Date")
+                        .HasColumnType("timestamp with time zone")
+                        .HasColumnName("date")
+                        .HasComment("'2021-10-19 18:23:54+05'");
+
+                    b.Property<float?>("AxialLoad")
+                        .HasColumnType("real")
+                        .HasColumnName("axial_load")
+                        .HasComment("Осевая нагрузка");
+
+                    b.Property<float?>("AxialLoadLimitMax")
+                        .HasColumnType("real")
+                        .HasColumnName("axial_load_limit_max")
+                        .HasComment("Осевая нагрузка. Аварийная макс.");
+
+                    b.Property<float?>("AxialLoadSp")
+                        .HasColumnType("real")
+                        .HasColumnName("axial_load_sp")
+                        .HasComment("Осевая нагрузка. Задание");
+
+                    b.Property<float?>("BitDepth")
+                        .HasColumnType("real")
+                        .HasColumnName("bit_depth")
+                        .HasComment("Положение инструмента");
+
+                    b.Property<float?>("BlockPosition")
+                        .HasColumnType("real")
+                        .HasColumnName("block_position")
+                        .HasComment("Высота талевого блока");
+
+                    b.Property<float?>("BlockPositionMax")
+                        .HasColumnType("real")
+                        .HasColumnName("block_position_max")
+                        .HasComment("Талевый блок. Макс положение");
+
+                    b.Property<float?>("BlockPositionMin")
+                        .HasColumnType("real")
+                        .HasColumnName("block_position_min")
+                        .HasComment("Талевый блок. Мин положение");
+
+                    b.Property<float?>("BlockSpeed")
+                        .HasColumnType("real")
+                        .HasColumnName("block_speed")
+                        .HasComment("Скорость талевого блока");
+
+                    b.Property<float?>("BlockSpeedSp")
+                        .HasColumnType("real")
+                        .HasColumnName("block_speed_sp")
+                        .HasComment("Скорости талевого блока. Задание");
+
+                    b.Property<float?>("BlockSpeedSpDevelop")
+                        .HasColumnType("real")
+                        .HasColumnName("block_speed_sp_develop")
+                        .HasComment("Талевый блок. Задание скорости для проработки");
+
+                    b.Property<float?>("BlockSpeedSpRotor")
+                        .HasColumnType("real")
+                        .HasColumnName("block_speed_sp_rotor")
+                        .HasComment("Талевый блок. Задание скорости для роторного бурения");
+
+                    b.Property<float?>("BlockSpeedSpSlide")
+                        .HasColumnType("real")
+                        .HasColumnName("block_speed_sp_slide")
+                        .HasComment("Талевый блок. Задание скорости для режима слайда");
+
+                    b.Property<float?>("Flow")
+                        .HasColumnType("real")
+                        .HasColumnName("flow")
+                        .HasComment("Расход");
+
+                    b.Property<float?>("FlowDeltaLimitMax")
+                        .HasColumnType("real")
+                        .HasColumnName("flow_delta_limit_max")
+                        .HasComment("Расход. Аварийный макс.");
+
+                    b.Property<float?>("FlowIdle")
+                        .HasColumnType("real")
+                        .HasColumnName("flow_idle")
+                        .HasComment("Расход. Холостой ход");
+
+                    b.Property<float?>("HookWeight")
+                        .HasColumnType("real")
+                        .HasColumnName("hook_weight")
+                        .HasComment("Вес на крюке");
+
+                    b.Property<float?>("HookWeightIdle")
+                        .HasColumnType("real")
+                        .HasColumnName("hook_weight_idle")
+                        .HasComment("Вес на крюке. Холостой ход");
+
+                    b.Property<float?>("HookWeightLimitMax")
+                        .HasColumnType("real")
+                        .HasColumnName("hook_weight_limit_max")
+                        .HasComment("Вес на крюке. Затяжка");
+
+                    b.Property<float?>("HookWeightLimitMin")
+                        .HasColumnType("real")
+                        .HasColumnName("hook_weight_limit_min")
+                        .HasComment("Вес на крюке. Посадка");
+
+                    b.Property<short?>("IdFeedRegulator")
+                        .HasColumnType("smallint")
+                        .HasColumnName("id_feed_regulator")
+                        .HasComment("Текущий критерий бурения");
+
+                    b.Property<int?>("IdUser")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_user")
+                        .HasComment("Пользователь САУБ");
+
+                    b.Property<short?>("Mode")
+                        .HasColumnType("smallint")
+                        .HasColumnName("mode")
+                        .HasComment("Режим САУБ");
+
+                    b.Property<short?>("MseState")
+                        .HasColumnType("smallint")
+                        .HasColumnName("mse_state")
+                        .HasComment("Текущее состояние работы MSE");
+
+                    b.Property<float?>("Pressure")
+                        .HasColumnType("real")
+                        .HasColumnName("pressure")
+                        .HasComment("Давление");
+
+                    b.Property<float?>("PressureDeltaLimitMax")
+                        .HasColumnType("real")
+                        .HasColumnName("pressure_delta_limit_max")
+                        .HasComment("Давление дифф. Аварийное макс.");
+
+                    b.Property<float?>("PressureIdle")
+                        .HasColumnType("real")
+                        .HasColumnName("pressure_idle")
+                        .HasComment("Давление. Холостой ход");
+
+                    b.Property<float?>("PressureSp")
+                        .HasColumnType("real")
+                        .HasColumnName("pressure_sp")
+                        .HasComment("Давление. Задание");
+
+                    b.Property<float?>("PressureSpDevelop")
+                        .HasColumnType("real")
+                        .HasColumnName("pressure_sp_develop")
+                        .HasComment("Давление. Задание для проработки");
+
+                    b.Property<float?>("PressureSpRotor")
+                        .HasColumnType("real")
+                        .HasColumnName("pressure_sp_rotor")
+                        .HasComment("Давление. Задание для роторного бурения");
+
+                    b.Property<float?>("PressureSpSlide")
+                        .HasColumnType("real")
+                        .HasColumnName("pressure_sp_slide")
+                        .HasComment("Давление. Задание для режима слайда");
+
+                    b.Property<float?>("RotorSpeed")
+                        .HasColumnType("real")
+                        .HasColumnName("rotor_speed")
+                        .HasComment("Обороты ротора");
+
+                    b.Property<float?>("RotorTorque")
+                        .HasColumnType("real")
+                        .HasColumnName("rotor_torque")
+                        .HasComment("Момент на роторе");
+
+                    b.Property<float?>("RotorTorqueIdle")
+                        .HasColumnType("real")
+                        .HasColumnName("rotor_torque_idle")
+                        .HasComment("Момент на роторе. Холостой ход");
+
+                    b.Property<float?>("RotorTorqueLimitMax")
+                        .HasColumnType("real")
+                        .HasColumnName("rotor_torque_limit_max")
+                        .HasComment("Момент на роторе. Аварийный макс.");
+
+                    b.Property<float?>("RotorTorqueSp")
+                        .HasColumnType("real")
+                        .HasColumnName("rotor_torque_sp")
+                        .HasComment("Момент на роторе. Задание");
+
+                    b.Property<float?>("WellDepth")
+                        .HasColumnType("real")
+                        .HasColumnName("well_depth")
+                        .HasComment("Глубина забоя");
+
+                    b.HasKey("IdTelemetry", "Date");
+
+                    b.ToTable("t_telemetry_data_saub");
+
+                    b
+                        .HasComment("набор основных данных по SAUB");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSpin", b =>
+                {
+                    b.Property<int>("IdTelemetry")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_telemetry");
+
+                    b.Property<DateTime>("Date")
+                        .HasColumnType("timestamp with time zone")
+                        .HasColumnName("date")
+                        .HasComment("'2021-10-19 18:23:54+05'");
+
+                    b.Property<float?>("BreakAngleK")
+                        .HasColumnType("real")
+                        .HasColumnName("break_angle_k")
+                        .HasComment("Коэффициент для расчёта за какой угол нужно тормозить");
+
+                    b.Property<float?>("BreakAngleLeft")
+                        .HasColumnType("real")
+                        .HasColumnName("break_angle_left")
+                        .HasComment("Угол торможения влево при работе по моменту");
+
+                    b.Property<float?>("EncoderResolution")
+                        .HasColumnType("real")
+                        .HasColumnName("encoder_resolution")
+                        .HasComment(" Разрешение энкодера");
+
+                    b.Property<short?>("Mode")
+                        .HasColumnType("smallint")
+                        .HasColumnName("mode")
+                        .HasComment("Выбранный режим управления");
+
+                    b.Property<float?>("PidMuxTorqueLeftLimit")
+                        .HasColumnType("real")
+                        .HasColumnName("pid_mux_torque_left_limit")
+                        .HasComment(" Момент при котором определяется ехать назад по моменту или по скорости");
+
+                    b.Property<float?>("PositionRight")
+                        .HasColumnType("real")
+                        .HasColumnName("position_right")
+                        .HasComment("Крайний правый угол осциляции");
+
+                    b.Property<float?>("PositionZero")
+                        .HasColumnType("real")
+                        .HasColumnName("position_zero")
+                        .HasComment("Нулевая позиция осциляции");
+
+                    b.Property<float?>("Ratio")
+                        .HasColumnType("real")
+                        .HasColumnName("ratio")
+                        .HasComment(" Коэффициент редукции редектора");
+
+                    b.Property<float?>("ReverseKTorque")
+                        .HasColumnType("real")
+                        .HasColumnName("reverse_k_torque")
+                        .HasComment("Коэффициент на который умножается момент, для того чтобы система поняла что мы движемся в обратную сторону");
+
+                    b.Property<short?>("ReverseSpeedSpZeroTime")
+                        .HasColumnType("smallint")
+                        .HasColumnName("reverse_speed_sp_zero_time")
+                        .HasComment("Время выдачи сигнала нулевой скорости на при смене направления");
+
+                    b.Property<float?>("RevolsLeftLimit")
+                        .HasColumnType("real")
+                        .HasColumnName("revols_left_limit")
+                        .HasComment("Ограничение числа оборотов влево");
+
+                    b.Property<float?>("RevolsLeftTotal")
+                        .HasColumnType("real")
+                        .HasColumnName("revols_left_total")
+                        .HasComment("Суммарное количество оборотов влево");
+
+                    b.Property<float?>("RevolsRightLimit")
+                        .HasColumnType("real")
+                        .HasColumnName("revols_right_limit")
+                        .HasComment("Ограничение числа оборотов вправо");
+
+                    b.Property<float?>("RevolsRightTotal")
+                        .HasColumnType("real")
+                        .HasColumnName("revols_right_total")
+                        .HasComment("Суммарное количество оборотов вправо");
+
+                    b.Property<float?>("RotorTorqueAvg")
+                        .HasColumnType("real")
+                        .HasColumnName("rotor_torque_avg")
+                        .HasComment(" Момент в роторе средний");
+
+                    b.Property<float?>("SpeedLeftSp")
+                        .HasColumnType("real")
+                        .HasColumnName("speed_left_sp")
+                        .HasComment("Заданная скорость вращения влево");
+
+                    b.Property<float?>("SpeedRightSp")
+                        .HasColumnType("real")
+                        .HasColumnName("speed_right_sp")
+                        .HasComment("Заданная скорость вращения вправо");
+
+                    b.Property<short?>("State")
+                        .HasColumnType("smallint")
+                        .HasColumnName("state")
+                        .HasComment("Переменная этапа");
+
+                    b.Property<float?>("TopDriveSpeed")
+                        .HasColumnType("real")
+                        .HasColumnName("top_drive_speed")
+                        .HasComment("Скорость СВП");
+
+                    b.Property<short?>("TopDriveSpeedErr")
+                        .HasColumnType("smallint")
+                        .HasColumnName("top_drive_speed_err");
+
+                    b.Property<float?>("TopDriveSpeedMax")
+                        .HasColumnType("real")
+                        .HasColumnName("top_drive_speed_max")
+                        .HasComment("верхний предел");
+
+                    b.Property<float?>("TopDriveSpeedMin")
+                        .HasColumnType("real")
+                        .HasColumnName("top_drive_speed_min")
+                        .HasComment("нижний предел");
+
+                    b.Property<float?>("TopDriveSpeedOffset")
+                        .HasColumnType("real")
+                        .HasColumnName("top_drive_speed_offset")
+                        .HasComment("смещение");
+
+                    b.Property<float?>("TopDriveSpeedSpFrom")
+                        .HasColumnType("real")
+                        .HasColumnName("top_drive_speed_sp_from")
+                        .HasComment("Заданная скорость c СВП");
+
+                    b.Property<short?>("TopDriveSpeedSpFromErr")
+                        .HasColumnType("smallint")
+                        .HasColumnName("top_drive_speed_sp_from_err");
+
+                    b.Property<float?>("TopDriveSpeedSpFromMax")
+                        .HasColumnType("real")
+                        .HasColumnName("top_drive_speed_sp_from_max");
+
+                    b.Property<float?>("TopDriveSpeedSpFromMin")
+                        .HasColumnType("real")
+                        .HasColumnName("top_drive_speed_sp_from_min");
+
+                    b.Property<float?>("TopDriveSpeedSpFromOffset")
+                        .HasColumnType("real")
+                        .HasColumnName("top_drive_speed_sp_from_offset");
+
+                    b.Property<float?>("TopDriveSpeedSpTo")
+                        .HasColumnType("real")
+                        .HasColumnName("top_drive_speed_sp_to")
+                        .HasComment("Задание скорости на СВП");
+
+                    b.Property<short?>("TopDriveSpeedSpToErr")
+                        .HasColumnType("smallint")
+                        .HasColumnName("top_drive_speed_sp_to_err");
+
+                    b.Property<float?>("TopDriveSpeedSpToMax")
+                        .HasColumnType("real")
+                        .HasColumnName("top_drive_speed_sp_to_max");
+
+                    b.Property<float?>("TopDriveSpeedSpToMin")
+                        .HasColumnType("real")
+                        .HasColumnName("top_drive_speed_sp_to_min");
+
+                    b.Property<float?>("TopDriveSpeedSpToOffset")
+                        .HasColumnType("real")
+                        .HasColumnName("top_drive_speed_sp_to_offset");
+
+                    b.Property<float?>("TopDriveTorque")
+                        .HasColumnType("real")
+                        .HasColumnName("top_drive_torque")
+                        .HasComment("Момент СВП");
+
+                    b.Property<short?>("TopDriveTorqueErr")
+                        .HasColumnType("smallint")
+                        .HasColumnName("top_drive_torque_err");
+
+                    b.Property<float?>("TopDriveTorqueMax")
+                        .HasColumnType("real")
+                        .HasColumnName("top_drive_torque_max");
+
+                    b.Property<float?>("TopDriveTorqueMin")
+                        .HasColumnType("real")
+                        .HasColumnName("top_drive_torque_min");
+
+                    b.Property<float?>("TopDriveTorqueOffset")
+                        .HasColumnType("real")
+                        .HasColumnName("top_drive_torque_offset");
+
+                    b.Property<float?>("TopDriveTorqueSpFrom")
+                        .HasColumnType("real")
+                        .HasColumnName("top_drive_torque_sp_from")
+                        .HasComment("Заданный момент c СВП");
+
+                    b.Property<short?>("TopDriveTorqueSpFromErr")
+                        .HasColumnType("smallint")
+                        .HasColumnName("top_drive_torque_sp_from_err");
+
+                    b.Property<float?>("TopDriveTorqueSpFromMax")
+                        .HasColumnType("real")
+                        .HasColumnName("top_drive_torque_sp_from_max");
+
+                    b.Property<float?>("TopDriveTorqueSpFromMin")
+                        .HasColumnType("real")
+                        .HasColumnName("top_drive_torque_sp_from_min");
+
+                    b.Property<float?>("TopDriveTorqueSpFromOffset")
+                        .HasColumnType("real")
+                        .HasColumnName("top_drive_torque_sp_from_offset");
+
+                    b.Property<float?>("TopDriveTorqueSpTo")
+                        .HasColumnType("real")
+                        .HasColumnName("top_drive_torque_sp_to")
+                        .HasComment("Задание момента на СВП");
+
+                    b.Property<short?>("TopDriveTorqueSpToErr")
+                        .HasColumnType("smallint")
+                        .HasColumnName("top_drive_torque_sp_to_err");
+
+                    b.Property<float?>("TopDriveTorqueSpToMax")
+                        .HasColumnType("real")
+                        .HasColumnName("top_drive_torque_sp_to_max");
+
+                    b.Property<float?>("TopDriveTorqueSpToMin")
+                        .HasColumnType("real")
+                        .HasColumnName("top_drive_torque_sp_to_min");
+
+                    b.Property<float?>("TopDriveTorqueSpToOffset")
+                        .HasColumnType("real")
+                        .HasColumnName("top_drive_torque_sp_to_offset");
+
+                    b.Property<float?>("TorqueLeftLimit")
+                        .HasColumnType("real")
+                        .HasColumnName("torque_left_limit")
+                        .HasComment("Ограничение крутящего момента влево");
+
+                    b.Property<float?>("TorqueRampTime")
+                        .HasColumnType("real")
+                        .HasColumnName("torque_ramp_time")
+                        .HasComment("Время нарастания момента");
+
+                    b.Property<float?>("TorqueRightLimit")
+                        .HasColumnType("real")
+                        .HasColumnName("torque_right_limit")
+                        .HasComment("Ограничение крутящего момента вправо");
+
+                    b.Property<float?>("TorqueStarting")
+                        .HasColumnType("real")
+                        .HasColumnName("torque_starting")
+                        .HasComment(" Страгивающий момент");
+
+                    b.Property<float?>("TurnLeftOnceByAngle")
+                        .HasColumnType("real")
+                        .HasColumnName("turn_left_once_by_angle")
+                        .HasComment("Доворот по градусам единожды влево");
+
+                    b.Property<float?>("TurnLeftOnceByRevols")
+                        .HasColumnType("real")
+                        .HasColumnName("turn_left_once_by_revols")
+                        .HasComment("Доворот по оборотам единожды влево");
+
+                    b.Property<float?>("TurnLeftOnceByTorque")
+                        .HasColumnType("real")
+                        .HasColumnName("turn_left_once_by_torque")
+                        .HasComment("Доворот по моменту единожды влево");
+
+                    b.Property<float?>("TurnRightOnceByAngle")
+                        .HasColumnType("real")
+                        .HasColumnName("turn_right_once_by_angle")
+                        .HasComment("Доворот по градусам единожды вправо");
+
+                    b.Property<float?>("TurnRightOnceByRevols")
+                        .HasColumnType("real")
+                        .HasColumnName("turn_right_once_by_revols")
+                        .HasComment("Доворот по оборотам единожды вправо");
+
+                    b.Property<float?>("TurnRightOnceByTorque")
+                        .HasColumnType("real")
+                        .HasColumnName("turn_right_once_by_torque")
+                        .HasComment("Доворот по моменту единожды вправо");
+
+                    b.Property<float?>("UnlockBySectorOut")
+                        .HasColumnType("real")
+                        .HasColumnName("unlock_by_sector_out")
+                        .HasComment(" Градус отклонения от сектора для автоматического сброса блокировки");
+
+                    b.Property<float?>("Ver")
+                        .HasColumnType("real")
+                        .HasColumnName("ver")
+                        .HasComment("Версия ПО ПЛК");
+
+                    b.Property<short?>("W2800")
+                        .HasColumnType("smallint")
+                        .HasColumnName("w2800")
+                        .HasComment("Установка нуля энкодера");
+
+                    b.Property<short?>("W2808")
+                        .HasColumnType("smallint")
+                        .HasColumnName("w2808")
+                        .HasComment("Неисправность энкодера");
+
+                    b.Property<short?>("W2810")
+                        .HasColumnType("smallint")
+                        .HasColumnName("w2810")
+                        .HasComment(" автоматический сброс блокировки");
+
+                    b.HasKey("IdTelemetry", "Date");
+
+                    b.ToTable("t_telemetry_data_spin");
+
+                    b
+                        .HasComment("набор основных данных по SpinMaster");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.TelemetryEvent", b =>
+                {
+                    b.Property<int>("IdTelemetry")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_telemetry");
+
+                    b.Property<int>("IdEvent")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_event");
+
+                    b.Property<int>("IdCategory")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_category");
+
+                    b.Property<string>("MessageTemplate")
+                        .HasColumnType("text")
+                        .HasColumnName("message_template");
+
+                    b.HasKey("IdTelemetry", "IdEvent");
+
+                    b.ToTable("t_telemetry_event");
+
+                    b
+                        .HasComment("Справочник событий. События формируют сообщения. Разделено по версиям посылок от телеметрии.");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.TelemetryMessage", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasColumnName("id")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Arg0")
+                        .HasMaxLength(255)
+                        .HasColumnType("character varying(255)")
+                        .HasColumnName("arg0")
+                        .HasComment("Аргумент №0 для вставки в шаблон сообщения");
+
+                    b.Property<string>("Arg1")
+                        .HasMaxLength(255)
+                        .HasColumnType("character varying(255)")
+                        .HasColumnName("arg1");
+
+                    b.Property<string>("Arg2")
+                        .HasMaxLength(255)
+                        .HasColumnType("character varying(255)")
+                        .HasColumnName("arg2");
+
+                    b.Property<string>("Arg3")
+                        .HasMaxLength(255)
+                        .HasColumnType("character varying(255)")
+                        .HasColumnName("arg3");
+
+                    b.Property<DateTime>("Date")
+                        .HasColumnType("timestamp with time zone")
+                        .HasColumnName("date");
+
+                    b.Property<int>("IdEvent")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_event");
+
+                    b.Property<int>("IdTelemetry")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_telemetry");
+
+                    b.Property<int?>("IdTelemetryUser")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_telemetry_user")
+                        .HasComment("Пользователь панели отправляющей телеметрию. не пользователь облака.");
+
+                    b.Property<double>("WellDepth")
+                        .HasColumnType("double precision")
+                        .HasColumnName("well_depth");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("IdTelemetry");
+
+                    b.ToTable("t_telemetry_message");
+
+                    b
+                        .HasComment("Сообщения на буровых");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.TelemetryUser", b =>
+                {
+                    b.Property<int>("IdTelemetry")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_telemetry");
+
+                    b.Property<int>("IdUser")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_user");
+
+                    b.Property<int?>("Level")
+                        .HasColumnType("integer")
+                        .HasColumnName("level");
+
+                    b.Property<string>("Name")
+                        .HasMaxLength(255)
+                        .HasColumnType("character varying(255)")
+                        .HasColumnName("name");
+
+                    b.Property<string>("Patronymic")
+                        .HasMaxLength(255)
+                        .HasColumnType("character varying(255)")
+                        .HasColumnName("patronymic");
+
+                    b.Property<string>("Surname")
+                        .HasMaxLength(255)
+                        .HasColumnType("character varying(255)")
+                        .HasColumnName("surname");
+
+                    b.HasKey("IdTelemetry", "IdUser");
+
+                    b.ToTable("t_telemetry_user");
+
+                    b
+                        .HasComment("Пользователи панели САУБ. Для сообщений.");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.User", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasColumnName("id")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Email")
+                        .HasMaxLength(255)
+                        .HasColumnType("character varying(255)")
+                        .HasColumnName("email")
+                        .HasComment("должность");
+
+                    b.Property<int?>("IdCompany")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_company");
+
+                    b.Property<string>("Login")
+                        .HasMaxLength(255)
+                        .HasColumnType("character varying(255)")
+                        .HasColumnName("login");
+
+                    b.Property<string>("Name")
+                        .HasMaxLength(255)
+                        .HasColumnType("character varying(255)")
+                        .HasColumnName("name")
+                        .HasComment("имя");
+
+                    b.Property<string>("PasswordHash")
+                        .HasMaxLength(255)
+                        .HasColumnType("character varying(255)")
+                        .HasColumnName("password_hash")
+                        .HasComment("соленый хэш пароля.\nпервые 5 символов - соль");
+
+                    b.Property<string>("Patronymic")
+                        .HasMaxLength(255)
+                        .HasColumnType("character varying(255)")
+                        .HasColumnName("patronymic")
+                        .HasComment("отчество");
+
+                    b.Property<string>("Phone")
+                        .HasMaxLength(50)
+                        .HasColumnType("character varying(50)")
+                        .HasColumnName("phone")
+                        .HasComment("номер телефона");
+
+                    b.Property<string>("Position")
+                        .HasMaxLength(255)
+                        .HasColumnType("character varying(255)")
+                        .HasColumnName("position")
+                        .HasComment("email");
+
+                    b.Property<short?>("State")
+                        .HasColumnType("smallint")
+                        .HasColumnName("state")
+                        .HasComment("состояние:\n100 - удален");
+
+                    b.Property<string>("Surname")
+                        .HasMaxLength(255)
+                        .HasColumnType("character varying(255)")
+                        .HasColumnName("surname")
+                        .HasComment("фамилия");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("IdCompany");
+
+                    b.HasIndex("Login")
+                        .IsUnique();
+
+                    b.ToTable("t_user");
+
+                    b
+                        .HasComment("Пользователи облака");
+
+                    b.HasData(
+                        new
+                        {
+                            Id = 1,
+                            IdCompany = 1,
+                            Login = "dev",
+                            Name = "Разработчик",
+                            PasswordHash = "Vlcj|4fa529103dde7ff72cfe76185f344d4aa87931f8e1b2044e8a7739947c3d18923464eaad93843e4f809c5e126d013072"
+                        });
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.UserRole", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasColumnName("id")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Caption")
+                        .HasMaxLength(255)
+                        .HasColumnType("character varying(255)")
+                        .HasColumnName("caption")
+                        .HasComment("Название");
+
+                    b.Property<int?>("IdParent")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_parent")
+                        .HasComment("От какой роли унаследована данная роль");
+
+                    b.Property<int>("IdType")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_type")
+                        .HasComment("0-роль из стандартной матрицы, \n1-специальная роль для какого-либо пользователя");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("t_user_role");
+
+                    b
+                        .HasComment("Роли пользователей в системе");
+
+                    b.HasData(
+                        new
+                        {
+                            Id = 1,
+                            Caption = "Администратор",
+                            IdType = 0
+                        },
+                        new
+                        {
+                            Id = 2,
+                            Caption = "Пользователь",
+                            IdType = 0
+                        });
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.Well", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasColumnName("id")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Caption")
+                        .HasMaxLength(255)
+                        .HasColumnType("character varying(255)")
+                        .HasColumnName("caption");
+
+                    b.Property<int?>("IdCluster")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_cluster");
+
+                    b.Property<int>("IdState")
+                        .HasColumnType("integer")
+                        .HasColumnName("state")
+                        .HasComment("0 - неизвестно, 1 - в работе, 2 - завершена");
+
+                    b.Property<int?>("IdTelemetry")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_telemetry");
+
+                    b.Property<int?>("IdWellType")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_well_type");
+
+                    b.Property<double?>("Latitude")
+                        .HasColumnType("double precision")
+                        .HasColumnName("latitude");
+
+                    b.Property<double?>("Longitude")
+                        .HasColumnType("double precision")
+                        .HasColumnName("longitude");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("IdCluster");
+
+                    b.HasIndex("IdTelemetry")
+                        .IsUnique();
+
+                    b.HasIndex("IdWellType");
+
+                    b.ToTable("t_well");
+
+                    b
+                        .HasComment("скважины");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.WellComposite", b =>
+                {
+                    b.Property<int>("IdWell")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_well")
+                        .HasComment("Id скважины получателя");
+
+                    b.Property<int>("IdWellSrc")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_well_src")
+                        .HasComment("Id скважины композита");
+
+                    b.Property<int>("IdWellSectionType")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_well_section_type")
+                        .HasComment("Id тип секции композита");
+
+                    b.HasKey("IdWell", "IdWellSrc", "IdWellSectionType");
+
+                    b.HasIndex("IdWellSectionType");
+
+                    b.HasIndex("IdWellSrc");
+
+                    b.ToTable("t_well_composite");
+
+                    b
+                        .HasComment("Композитная скважина");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.WellOperation", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasColumnName("id")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("CategoryInfo")
+                        .HasColumnType("text")
+                        .HasColumnName("category_info")
+                        .HasComment("Доп. информация к выбраной категории");
+
+                    b.Property<string>("Comment")
+                        .HasColumnType("text")
+                        .HasColumnName("comment")
+                        .HasComment("Комментарий");
+
+                    b.Property<DateTime>("DateStart")
+                        .HasColumnType("timestamp without time zone")
+                        .HasColumnName("date_start")
+                        .HasComment("Дата начала операции");
+
+                    b.Property<double>("DepthEnd")
+                        .HasColumnType("double precision")
+                        .HasColumnName("depth_end")
+                        .HasComment("Глубина после завершения операции, м");
+
+                    b.Property<double>("DepthStart")
+                        .HasColumnType("double precision")
+                        .HasColumnName("depth_start")
+                        .HasComment("Глубина на начало операции, м");
+
+                    b.Property<double>("DurationHours")
+                        .HasColumnType("double precision")
+                        .HasColumnName("duration_hours")
+                        .HasComment("Продолжительность, часы");
+
+                    b.Property<int>("IdCategory")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_category")
+                        .HasComment("Id категории операции");
+
+                    b.Property<int>("IdType")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_type")
+                        .HasComment("0 = План или 1 = Факт");
+
+                    b.Property<int>("IdWell")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_well")
+                        .HasComment("Id скважины");
+
+                    b.Property<int>("IdWellSectionType")
+                        .HasColumnType("integer")
+                        .HasColumnName("id_well_section_type")
+                        .HasComment("Id тип секции скважины");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("DateStart");
+
+                    b.HasIndex("DepthEnd");
+
+                    b.HasIndex("IdCategory");
+
+                    b.HasIndex("IdWell");
+
+                    b.HasIndex("IdWellSectionType");
+
+                    b.ToTable("t_well_operation");
+
+                    b
+                        .HasComment("Данные по операциям на скважине");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.WellOperationCategory", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasColumnName("id")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<int>("Code")
+                        .HasColumnType("integer")
+                        .HasColumnName("code")
+                        .HasComment("Код операции");
+
+                    b.Property<string>("Name")
+                        .HasColumnType("text")
+                        .HasColumnName("name")
+                        .HasComment("Название категории операции");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("t_well_operation_category");
+
+                    b
+                        .HasComment("Справочник операций на скважине");
+
+                    b.HasData(
+                        new
+                        {
+                            Id = 1,
+                            Code = 0,
+                            Name = "Невозможно определить операцию"
+                        },
+                        new
+                        {
+                            Id = 2,
+                            Code = 0,
+                            Name = "Роторное бурение"
+                        },
+                        new
+                        {
+                            Id = 3,
+                            Code = 0,
+                            Name = "Слайдирование"
+                        },
+                        new
+                        {
+                            Id = 4,
+                            Code = 0,
+                            Name = "Подъем с проработкой"
+                        },
+                        new
+                        {
+                            Id = 5,
+                            Code = 0,
+                            Name = "Спуск с проработкой"
+                        },
+                        new
+                        {
+                            Id = 6,
+                            Code = 0,
+                            Name = "Подъем с промывкой"
+                        },
+                        new
+                        {
+                            Id = 7,
+                            Code = 0,
+                            Name = "Спуск с промывкой"
+                        },
+                        new
+                        {
+                            Id = 8,
+                            Code = 0,
+                            Name = "Спуск в скважину"
+                        },
+                        new
+                        {
+                            Id = 9,
+                            Code = 0,
+                            Name = "Спуск с вращением"
+                        },
+                        new
+                        {
+                            Id = 10,
+                            Code = 0,
+                            Name = "Подъем из скважины"
+                        },
+                        new
+                        {
+                            Id = 11,
+                            Code = 0,
+                            Name = "Подъем с вращением"
+                        },
+                        new
+                        {
+                            Id = 12,
+                            Code = 0,
+                            Name = "Промывка в покое"
+                        },
+                        new
+                        {
+                            Id = 13,
+                            Code = 0,
+                            Name = "Промывка с вращением"
+                        },
+                        new
+                        {
+                            Id = 14,
+                            Code = 0,
+                            Name = "Удержание в клиньях"
+                        },
+                        new
+                        {
+                            Id = 15,
+                            Code = 0,
+                            Name = "Неподвижное состояние"
+                        },
+                        new
+                        {
+                            Id = 16,
+                            Code = 0,
+                            Name = "Вращение без циркуляции"
+                        },
+                        new
+                        {
+                            Id = 17,
+                            Code = 0,
+                            Name = "На поверхности"
+                        },
+                        new
+                        {
+                            Id = 1001,
+                            Code = 0,
+                            Name = "Бурение"
+                        },
+                        new
+                        {
+                            Id = 1002,
+                            Code = 0,
+                            Name = "ГИС"
+                        },
+                        new
+                        {
+                            Id = 1003,
+                            Code = 0,
+                            Name = "ГФР"
+                        },
+                        new
+                        {
+                            Id = 1004,
+                            Code = 0,
+                            Name = "Монтаж ПВО"
+                        },
+                        new
+                        {
+                            Id = 1005,
+                            Code = 0,
+                            Name = "Демонтаж ПВО"
+                        },
+                        new
+                        {
+                            Id = 1006,
+                            Code = 0,
+                            Name = "Установка ФА"
+                        },
+                        new
+                        {
+                            Id = 1007,
+                            Code = 0,
+                            Name = "Оборудование устья"
+                        },
+                        new
+                        {
+                            Id = 1008,
+                            Code = 0,
+                            Name = "ОЗЦ"
+                        },
+                        new
+                        {
+                            Id = 1011,
+                            Code = 0,
+                            Name = "Начало цикла строительства скважины"
+                        },
+                        new
+                        {
+                            Id = 1012,
+                            Code = 0,
+                            Name = "Окончание цикла строительства скважины"
+                        },
+                        new
+                        {
+                            Id = 1013,
+                            Code = 0,
+                            Name = "Опрессовка ПВО"
+                        },
+                        new
+                        {
+                            Id = 1014,
+                            Code = 0,
+                            Name = "Опресовка Ц.К."
+                        },
+                        new
+                        {
+                            Id = 1015,
+                            Code = 0,
+                            Name = "Опрессовка ВЗД"
+                        },
+                        new
+                        {
+                            Id = 1016,
+                            Code = 0,
+                            Name = "Перевод скв на другой тип промывочной жидкости"
+                        },
+                        new
+                        {
+                            Id = 1017,
+                            Code = 0,
+                            Name = "Перезапись каротажа"
+                        },
+                        new
+                        {
+                            Id = 1018,
+                            Code = 0,
+                            Name = "Перетяжка талевого каната"
+                        },
+                        new
+                        {
+                            Id = 1019,
+                            Code = 0,
+                            Name = "Наращивание, промывка"
+                        },
+                        new
+                        {
+                            Id = 1020,
+                            Code = 0,
+                            Name = "Подъем инструмента"
+                        },
+                        new
+                        {
+                            Id = 1021,
+                            Code = 0,
+                            Name = "Подъем инструмента с промывкой"
+                        },
+                        new
+                        {
+                            Id = 1022,
+                            Code = 0,
+                            Name = "Обратная проработка"
+                        },
+                        new
+                        {
+                            Id = 1023,
+                            Code = 0,
+                            Name = "Сборка инструмента с мостков"
+                        },
+                        new
+                        {
+                            Id = 1024,
+                            Code = 0,
+                            Name = "Подготовительные работы"
+                        },
+                        new
+                        {
+                            Id = 1025,
+                            Code = 0,
+                            Name = "Сборка КНБК"
+                        },
+                        new
+                        {
+                            Id = 1026,
+                            Code = 0,
+                            Name = "Разборка КНБК"
+                        },
+                        new
+                        {
+                            Id = 1027,
+                            Code = 0,
+                            Name = "Промывка"
+                        },
+                        new
+                        {
+                            Id = 1028,
+                            Code = 0,
+                            Name = "Промежуточная промывка"
+                        },
+                        new
+                        {
+                            Id = 1029,
+                            Code = 0,
+                            Name = "Прокачка пачек"
+                        },
+                        new
+                        {
+                            Id = 1030,
+                            Code = 0,
+                            Name = "Разбуривание тех.оснастки"
+                        },
+                        new
+                        {
+                            Id = 1031,
+                            Code = 0,
+                            Name = "Ремонт"
+                        },
+                        new
+                        {
+                            Id = 1032,
+                            Code = 0,
+                            Name = "Спуск инструмента"
+                        },
+                        new
+                        {
+                            Id = 1033,
+                            Code = 0,
+                            Name = "Спуск инструмента с промывкой"
+                        },
+                        new
+                        {
+                            Id = 1034,
+                            Code = 0,
+                            Name = "Прямая проработка"
+                        },
+                        new
+                        {
+                            Id = 1035,
+                            Code = 0,
+                            Name = "Принудительная проработка"
+                        },
+                        new
+                        {
+                            Id = 1037,
+                            Code = 0,
+                            Name = "Тех СПО-подъем"
+                        },
+                        new
+                        {
+                            Id = 1038,
+                            Code = 0,
+                            Name = "Тех СПО-спуск"
+                        },
+                        new
+                        {
+                            Id = 1039,
+                            Code = 0,
+                            Name = "Техническое обслуживание"
+                        },
+                        new
+                        {
+                            Id = 1040,
+                            Code = 0,
+                            Name = "Цементаж"
+                        },
+                        new
+                        {
+                            Id = 1041,
+                            Code = 0,
+                            Name = "Шаблонировка ствола"
+                        },
+                        new
+                        {
+                            Id = 1042,
+                            Code = 0,
+                            Name = "Геологическое осложнение"
+                        },
+                        new
+                        {
+                            Id = 1043,
+                            Code = 0,
+                            Name = "НПВ"
+                        },
+                        new
+                        {
+                            Id = 1044,
+                            Code = 0,
+                            Name = "ВМР"
+                        },
+                        new
+                        {
+                            Id = 1045,
+                            Code = 0,
+                            Name = "Прочее"
+                        },
+                        new
+                        {
+                            Id = 1046,
+                            Code = 0,
+                            Name = "Спуск КНБК"
+                        },
+                        new
+                        {
+                            Id = 1047,
+                            Code = 0,
+                            Name = "Подъем КНБК"
+                        },
+                        new
+                        {
+                            Id = 1048,
+                            Code = 0,
+                            Name = "Спуск ОК"
+                        },
+                        new
+                        {
+                            Id = 1050,
+                            Code = 0,
+                            Name = "Промывка при спуске ОК"
+                        },
+                        new
+                        {
+                            Id = 1051,
+                            Code = 0,
+                            Name = "Замер ТС"
+                        },
+                        new
+                        {
+                            Id = 1052,
+                            Code = 0,
+                            Name = "Тех. отстой"
+                        },
+                        new
+                        {
+                            Id = 1053,
+                            Code = 0,
+                            Name = "Циркуляция и Обработка БР"
+                        },
+                        new
+                        {
+                            Id = 1054,
+                            Code = 0,
+                            Name = "Срезка ствола"
+                        },
+                        new
+                        {
+                            Id = 1055,
+                            Code = 0,
+                            Name = "Вспомогательные работы"
+                        });
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.WellSectionType", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasColumnName("id")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Caption")
+                        .HasMaxLength(255)
+                        .HasColumnType("character varying(255)")
+                        .HasColumnName("caption")
+                        .HasComment("Название");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("t_well_section_type");
+
+                    b
+                        .HasComment("конструкция секции скважины");
+
+                    b.HasData(
+                        new
+                        {
+                            Id = 1,
+                            Caption = "Пилотный ствол"
+                        },
+                        new
+                        {
+                            Id = 2,
+                            Caption = "Направление"
+                        },
+                        new
+                        {
+                            Id = 3,
+                            Caption = "Кондуктор"
+                        },
+                        new
+                        {
+                            Id = 4,
+                            Caption = "Эксплуатационная колонна"
+                        },
+                        new
+                        {
+                            Id = 5,
+                            Caption = "Транспортный ствол"
+                        },
+                        new
+                        {
+                            Id = 6,
+                            Caption = "Хвостовик"
+                        });
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.WellType", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasColumnName("id")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Caption")
+                        .HasMaxLength(255)
+                        .HasColumnType("character varying(255)")
+                        .HasColumnName("caption")
+                        .HasComment("Название");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("t_well_type");
+
+                    b
+                        .HasComment("конструкция скважины");
+
+                    b.HasData(
+                        new
+                        {
+                            Id = 1,
+                            Caption = "Наклонно-направленная"
+                        },
+                        new
+                        {
+                            Id = 2,
+                            Caption = "Горизонтальная"
+                        });
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.Cluster", b =>
+                {
+                    b.HasOne("AsbCloudDb.Model.Deposit", "Deposit")
+                        .WithMany("Clusters")
+                        .HasForeignKey("IdDeposit")
+                        .HasConstraintName("t_cluster_t_deposit_id_fk");
+
+                    b.Navigation("Deposit");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.Company", b =>
+                {
+                    b.HasOne("AsbCloudDb.Model.CompanyType", "CompanyType")
+                        .WithMany("Companies")
+                        .HasForeignKey("IdCompanyType")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("CompanyType");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.DrillFlowChart", b =>
+                {
+                    b.HasOne("AsbCloudDb.Model.Well", "Well")
+                        .WithMany()
+                        .HasForeignKey("IdWell")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Well");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.DrillParams", b =>
+                {
+                    b.HasOne("AsbCloudDb.Model.Well", "Well")
+                        .WithMany()
+                        .HasForeignKey("IdWell")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType")
+                        .WithMany("DrillParamsCollection")
+                        .HasForeignKey("IdWellSectionType")
+                        .HasConstraintName("t_drill_params_t_well_section_type_id_fk")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Well");
+
+                    b.Navigation("WellSectionType");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.FileInfo", b =>
+                {
+                    b.HasOne("AsbCloudDb.Model.User", "Author")
+                        .WithMany("Files")
+                        .HasForeignKey("IdAuthor");
+
+                    b.HasOne("AsbCloudDb.Model.FileCategory", "FileCategory")
+                        .WithMany()
+                        .HasForeignKey("IdCategory")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("AsbCloudDb.Model.Well", "Well")
+                        .WithMany()
+                        .HasForeignKey("IdWell")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Author");
+
+                    b.Navigation("FileCategory");
+
+                    b.Navigation("Well");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.FileMark", b =>
+                {
+                    b.HasOne("AsbCloudDb.Model.FileInfo", "FileInfo")
+                        .WithMany("FileMarks")
+                        .HasForeignKey("IdFile")
+                        .HasConstraintName("t_file_mark_t_file_info_fk")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("AsbCloudDb.Model.User", "User")
+                        .WithMany("FileMarks")
+                        .HasForeignKey("IdUser")
+                        .HasConstraintName("t_user_t_file_mark_fk")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("FileInfo");
+
+                    b.Navigation("User");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.Measure", b =>
+                {
+                    b.HasOne("AsbCloudDb.Model.MeasureCategory", "Category")
+                        .WithMany("Measures")
+                        .HasForeignKey("IdCategory")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("AsbCloudDb.Model.Well", "Well")
+                        .WithMany()
+                        .HasForeignKey("IdWell")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Category");
+
+                    b.Navigation("Well");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.RelationCompanyWell", b =>
+                {
+                    b.HasOne("AsbCloudDb.Model.Company", "Company")
+                        .WithMany("RelationCompaniesWells")
+                        .HasForeignKey("IdCompany")
+                        .HasConstraintName("t_relation_company_well_t_company_id_fk")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("AsbCloudDb.Model.Well", "Well")
+                        .WithMany("RelationCompaniesWells")
+                        .HasForeignKey("IdWell")
+                        .HasConstraintName("t_relation_company_well_t_well_id_fk")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Company");
+
+                    b.Navigation("Well");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.RelationUserRolePermission", b =>
+                {
+                    b.HasOne("AsbCloudDb.Model.Permission", "Permission")
+                        .WithMany("RelationUserRolePermissions")
+                        .HasForeignKey("IdPermission")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("AsbCloudDb.Model.UserRole", "UserRole")
+                        .WithMany("RelationUserRolePermissions")
+                        .HasForeignKey("IdUserRole")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Permission");
+
+                    b.Navigation("UserRole");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.RelationUserUserRole", b =>
+                {
+                    b.HasOne("AsbCloudDb.Model.User", "User")
+                        .WithMany("RelationUsersUserRoles")
+                        .HasForeignKey("IdUser")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("AsbCloudDb.Model.UserRole", "UserRole")
+                        .WithMany("RelationUsersUserRoles")
+                        .HasForeignKey("IdUserRole")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("User");
+
+                    b.Navigation("UserRole");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.ReportProperty", b =>
+                {
+                    b.HasOne("AsbCloudDb.Model.FileInfo", "File")
+                        .WithMany()
+                        .HasForeignKey("IdFile")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("AsbCloudDb.Model.Well", "Well")
+                        .WithMany()
+                        .HasForeignKey("IdWell")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("File");
+
+                    b.Navigation("Well");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.SetpointsRequest", b =>
+                {
+                    b.HasOne("AsbCloudDb.Model.User", "Author")
+                        .WithMany()
+                        .HasForeignKey("IdAuthor")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("AsbCloudDb.Model.Well", "Well")
+                        .WithMany()
+                        .HasForeignKey("IdWell")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Author");
+
+                    b.Navigation("Well");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.TelemetryAnalysis", b =>
+                {
+                    b.HasOne("AsbCloudDb.Model.WellOperationCategory", "Operation")
+                        .WithMany("Analysis")
+                        .HasForeignKey("IdOperation")
+                        .HasConstraintName("t_analysis_t_operation_id_fk")
+                        .OnDelete(DeleteBehavior.SetNull)
+                        .IsRequired();
+
+                    b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry")
+                        .WithMany("Analysis")
+                        .HasForeignKey("IdTelemetry")
+                        .HasConstraintName("t_analysis_t_telemetry_id_fk")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Operation");
+
+                    b.Navigation("Telemetry");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaub", b =>
+                {
+                    b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry")
+                        .WithMany("DataSaub")
+                        .HasForeignKey("IdTelemetry")
+                        .HasConstraintName("t_telemetry_data_saub_t_telemetry_id_fk")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Telemetry");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSpin", b =>
+                {
+                    b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry")
+                        .WithMany("DataSpin")
+                        .HasForeignKey("IdTelemetry")
+                        .HasConstraintName("t_telemetry_data_spin_t_telemetry_id_fk")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Telemetry");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.TelemetryEvent", b =>
+                {
+                    b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry")
+                        .WithMany("Events")
+                        .HasForeignKey("IdTelemetry")
+                        .HasConstraintName("t_event_t_telemetry_id_fk")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Telemetry");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.TelemetryMessage", b =>
+                {
+                    b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry")
+                        .WithMany("Messages")
+                        .HasForeignKey("IdTelemetry")
+                        .HasConstraintName("t_messages_t_telemetry_id_fk")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Telemetry");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.TelemetryUser", b =>
+                {
+                    b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry")
+                        .WithMany("Users")
+                        .HasForeignKey("IdTelemetry")
+                        .HasConstraintName("t_telemetry_user_t_telemetry_id_fk")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Telemetry");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.User", b =>
+                {
+                    b.HasOne("AsbCloudDb.Model.Company", "Company")
+                        .WithMany("Users")
+                        .HasForeignKey("IdCompany")
+                        .HasConstraintName("t_user_t_company_id_fk")
+                        .OnDelete(DeleteBehavior.SetNull);
+
+                    b.Navigation("Company");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.Well", b =>
+                {
+                    b.HasOne("AsbCloudDb.Model.Cluster", "Cluster")
+                        .WithMany("Wells")
+                        .HasForeignKey("IdCluster")
+                        .HasConstraintName("t_well_t_cluster_id_fk");
+
+                    b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry")
+                        .WithOne("Well")
+                        .HasForeignKey("AsbCloudDb.Model.Well", "IdTelemetry")
+                        .HasConstraintName("t_well_t_telemetry_id_fk")
+                        .OnDelete(DeleteBehavior.SetNull);
+
+                    b.HasOne("AsbCloudDb.Model.WellType", "WellType")
+                        .WithMany("Wells")
+                        .HasForeignKey("IdWellType");
+
+                    b.Navigation("Cluster");
+
+                    b.Navigation("Telemetry");
+
+                    b.Navigation("WellType");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.WellComposite", b =>
+                {
+                    b.HasOne("AsbCloudDb.Model.Well", "Well")
+                        .WithMany("WellComposites")
+                        .HasForeignKey("IdWell")
+                        .HasConstraintName("t_well_сomposite_t_well_id_fk")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType")
+                        .WithMany("WellComposites")
+                        .HasForeignKey("IdWellSectionType")
+                        .HasConstraintName("t_well_сomposite_t_well_section_type_id_fk")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("AsbCloudDb.Model.Well", "WellSrc")
+                        .WithMany("WellCompositeSrcs")
+                        .HasForeignKey("IdWellSrc")
+                        .HasConstraintName("t_well_сomposite_src_t_well_id_fk")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Well");
+
+                    b.Navigation("WellSectionType");
+
+                    b.Navigation("WellSrc");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.WellOperation", b =>
+                {
+                    b.HasOne("AsbCloudDb.Model.WellOperationCategory", "OperationCategory")
+                        .WithMany()
+                        .HasForeignKey("IdCategory")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("AsbCloudDb.Model.Well", "Well")
+                        .WithMany("WellOperations")
+                        .HasForeignKey("IdWell")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType")
+                        .WithMany("WellOperations")
+                        .HasForeignKey("IdWellSectionType")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("OperationCategory");
+
+                    b.Navigation("Well");
+
+                    b.Navigation("WellSectionType");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.Cluster", b =>
+                {
+                    b.Navigation("Wells");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.Company", b =>
+                {
+                    b.Navigation("RelationCompaniesWells");
+
+                    b.Navigation("Users");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.CompanyType", b =>
+                {
+                    b.Navigation("Companies");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.Deposit", b =>
+                {
+                    b.Navigation("Clusters");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.FileInfo", b =>
+                {
+                    b.Navigation("FileMarks");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.MeasureCategory", b =>
+                {
+                    b.Navigation("Measures");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.Permission", b =>
+                {
+                    b.Navigation("RelationUserRolePermissions");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.Telemetry", b =>
+                {
+                    b.Navigation("Analysis");
+
+                    b.Navigation("DataSaub");
+
+                    b.Navigation("DataSpin");
+
+                    b.Navigation("Events");
+
+                    b.Navigation("Messages");
+
+                    b.Navigation("Users");
+
+                    b.Navigation("Well");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.User", b =>
+                {
+                    b.Navigation("FileMarks");
+
+                    b.Navigation("Files");
+
+                    b.Navigation("RelationUsersUserRoles");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.UserRole", b =>
+                {
+                    b.Navigation("RelationUserRolePermissions");
+
+                    b.Navigation("RelationUsersUserRoles");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.Well", b =>
+                {
+                    b.Navigation("RelationCompaniesWells");
+
+                    b.Navigation("WellComposites");
+
+                    b.Navigation("WellCompositeSrcs");
+
+                    b.Navigation("WellOperations");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.WellOperationCategory", b =>
+                {
+                    b.Navigation("Analysis");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.WellSectionType", b =>
+                {
+                    b.Navigation("DrillParamsCollection");
+
+                    b.Navigation("WellComposites");
+
+                    b.Navigation("WellOperations");
+                });
+
+            modelBuilder.Entity("AsbCloudDb.Model.WellType", b =>
+                {
+                    b.Navigation("Wells");
+                });
+#pragma warning restore 612, 618
+        }
+    }
+}
diff --git a/AsbCloudDb/Migrations/20211216072650_RemovedIdFromPermissionRelations.cs b/AsbCloudDb/Migrations/20211216072650_RemovedIdFromPermissionRelations.cs
new file mode 100644
index 00000000..70588f1e
--- /dev/null
+++ b/AsbCloudDb/Migrations/20211216072650_RemovedIdFromPermissionRelations.cs
@@ -0,0 +1,35 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+namespace AsbCloudDb.Migrations
+{
+    public partial class RemovedIdFromPermissionRelations : Migration
+    {
+        protected override void Up(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropColumn(
+                name: "id",
+                table: "t_relation_user_user_role");
+
+            migrationBuilder.DropColumn(
+                name: "id",
+                table: "t_relation_user_role_permission");
+        }
+
+        protected override void Down(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.AddColumn<int>(
+                name: "id",
+                table: "t_relation_user_user_role",
+                type: "integer",
+                nullable: false,
+                defaultValue: 0);
+
+            migrationBuilder.AddColumn<int>(
+                name: "id",
+                table: "t_relation_user_role_permission",
+                type: "integer",
+                nullable: false,
+                defaultValue: 0);
+        }
+    }
+}
diff --git a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs
index 183a84a5..ce8af664 100644
--- a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs
+++ b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs
@@ -739,10 +739,6 @@ namespace AsbCloudDb.Migrations
                         .HasColumnType("integer")
                         .HasColumnName("id_permission");
 
-                    b.Property<int>("Id")
-                        .HasColumnType("integer")
-                        .HasColumnName("id");
-
                     b.HasKey("IdUserRole", "IdPermission");
 
                     b.HasIndex("IdPermission");
@@ -763,10 +759,6 @@ namespace AsbCloudDb.Migrations
                         .HasColumnType("integer")
                         .HasColumnName("id_user_role");
 
-                    b.Property<int>("Id")
-                        .HasColumnType("integer")
-                        .HasColumnName("id");
-
                     b.HasKey("IdUser", "IdUserRole");
 
                     b.HasIndex("IdUserRole");
@@ -780,8 +772,7 @@ namespace AsbCloudDb.Migrations
                         new
                         {
                             IdUser = 1,
-                            IdUserRole = 2,
-                            Id = 0
+                            IdUserRole = 2
                         });
                 });
 
diff --git a/AsbCloudDb/Model/RelationUserRolePermission.cs b/AsbCloudDb/Model/RelationUserRolePermission.cs
index 1cf5bd63..5d0f360b 100644
--- a/AsbCloudDb/Model/RelationUserRolePermission.cs
+++ b/AsbCloudDb/Model/RelationUserRolePermission.cs
@@ -7,10 +7,6 @@ namespace AsbCloudDb.Model
     [Table("t_relation_user_role_permission"), Comment("Отношение ролей пользователей и разрешений доступа")]
     public class RelationUserRolePermission
     {
-        [Key]
-        [Column("id")]
-        public int Id { get; set; }
-        
         [Column("id_user_role")]
         public int IdUserRole { get; set; }
 
diff --git a/AsbCloudDb/Model/RelationUserUserRole.cs b/AsbCloudDb/Model/RelationUserUserRole.cs
index f841446d..132875fa 100644
--- a/AsbCloudDb/Model/RelationUserUserRole.cs
+++ b/AsbCloudDb/Model/RelationUserUserRole.cs
@@ -7,10 +7,6 @@ namespace AsbCloudDb.Model
     [Table("t_relation_user_user_role"), Comment("Отношение пользователей и ролей")]
     public class RelationUserUserRole
     {
-        [Key]
-        [Column("id")]
-        public int Id { get; set; }
-        
         [Column("id_user")]
         public int IdUser { get; set; }
 
diff --git a/AsbCloudInfrastructure/Services/UserRoleService.cs b/AsbCloudInfrastructure/Services/UserRoleService.cs
index c07d440d..11640264 100644
--- a/AsbCloudInfrastructure/Services/UserRoleService.cs
+++ b/AsbCloudInfrastructure/Services/UserRoleService.cs
@@ -116,7 +116,7 @@ namespace AsbCloudInfrastructure.Services
                             new PermissionBaseDto
                             {
                                 Id = newPermission.Id,
-                                PermissionName = newPermission.Name ??
+                                Name = newPermission.Name ??
                                     cachePermission.FirstOrDefault(p => p.Id == newPermission.Id).Name
                             });
                     }
@@ -137,7 +137,7 @@ namespace AsbCloudInfrastructure.Services
             {
                 Id = p.Id,
                 IdUserRole = roleDto.Id,
-                PermissionName = p.PermissionName
+                Name = p.Name
             });
 
             await permissionService.InsertRangeAsync(newPermissions, token)
@@ -171,20 +171,17 @@ namespace AsbCloudInfrastructure.Services
         public Task<int> DeleteAsync(IEnumerable<int> ids, CancellationToken token = default)
         => cacheUserRoles.RemoveAsync(r => ids.Contains(r.Id), token);
 
-        public bool HasPermission(IEnumerable<int> rolesIds, string permissionName, int permissionMask = 0)
+        public bool HasPermission(IEnumerable<int> rolesIds, string permissionName)
         {
             var permissionInfo = cachePermission.FirstOrDefault(p => p.Name.ToLower() == permissionName.ToLower());
 
             if (permissionInfo is null)
                 return false;
 
-            if (permissionMask == 0)
-                permissionMask = -1;
-
             var idPermissionInfo = permissionInfo.Id;
             var roles = cacheUserRoles.Where(r => rolesIds.Contains(r.Id));
             foreach (var role in roles)
-                if (HasPermission(role, idPermissionInfo, permissionMask))
+                if (HasPermission(role, idPermissionInfo))
                     return true;
             return false;
         }
diff --git a/AsbCloudInfrastructure/Services/UserService.cs b/AsbCloudInfrastructure/Services/UserService.cs
index de8b3890..d39aaf03 100644
--- a/AsbCloudInfrastructure/Services/UserService.cs
+++ b/AsbCloudInfrastructure/Services/UserService.cs
@@ -152,15 +152,14 @@ namespace AsbCloudInfrastructure.Services
             return false;
         }
 
-        public bool HasPermission(int idUser, string permissionName, int permissionMask = 0)
+        public bool HasPermission(int idUser, string permissionName)
         {
             var relationsToRoles = cacheRelationUserToRoles.Where(r=>r.IdUser == idUser);
             if (relationsToRoles is null)
                 return false;
 
             return RoleService.HasPermission(relationsToRoles.Select(r => r.IdUserRole),
-                                                        permissionName,
-                                                        permissionMask);
+                                                        permissionName);
         }
     }
 }
diff --git a/AsbCloudWebApi/Controllers/AdminPermissionController.cs b/AsbCloudWebApi/Controllers/AdminPermissionController.cs
index f525fc07..892ad29a 100644
--- a/AsbCloudWebApi/Controllers/AdminPermissionController.cs
+++ b/AsbCloudWebApi/Controllers/AdminPermissionController.cs
@@ -28,6 +28,7 @@ namespace AsbCloudWebApi.Controllers
         /// <returns></returns>
         [HttpGet]
         [ProducesResponseType(typeof(IEnumerable<PermissionDto>), (int)System.Net.HttpStatusCode.OK)]
+        [Permission]
         public async Task<IActionResult> GetByIdRoleAsync(int idRole, CancellationToken token = default)
         {
             var result = await permissionService.GetByIdRoleAsync(idRole, token);
diff --git a/AsbCloudWebApi/Middlewares/PermissionsMiddlware.cs b/AsbCloudWebApi/Middlewares/PermissionsMiddlware.cs
index 38d5f420..2644c2da 100644
--- a/AsbCloudWebApi/Middlewares/PermissionsMiddlware.cs
+++ b/AsbCloudWebApi/Middlewares/PermissionsMiddlware.cs
@@ -42,10 +42,9 @@ namespace AsbCloudWebApi.Middlewares
                     .GetMetadata<Microsoft.AspNetCore.Mvc.Controllers.ControllerActionDescriptor>()
                     ?.ControllerName
                     .ToLower();
-
-            var permissionMask = permission.Mask;
+            
             var userService = context.RequestServices.GetRequiredService<IUserService>();
-            var isAuthorized = userService.HasPermission((int)idUser, permissionName, permissionMask);
+            var isAuthorized = userService.HasPermission((int)idUser, permissionName);
 
             if(isAuthorized)
                 await next?.Invoke(context);
diff --git a/AsbCloudWebApi/PermissionAttribute.cs b/AsbCloudWebApi/PermissionAttribute.cs
index 819da218..74e0b152 100644
--- a/AsbCloudWebApi/PermissionAttribute.cs
+++ b/AsbCloudWebApi/PermissionAttribute.cs
@@ -49,7 +49,6 @@ namespace AsbCloudWebApi
         public static SortedSet<string> Registered { get; } = new SortedSet<string>();
 
         public string Name { get; set; }
-        public int Mask { get; set; }
 
         /// <summary>
         /// Проверка наличия у пользователя разрешения.
@@ -59,7 +58,6 @@ namespace AsbCloudWebApi
         public PermissionAttribute(string name = default, int mask = -1)
         {
             Name = name;
-            Mask = mask;
             Registered.Add(name);
         }
     }
diff --git a/ConsoleApp1/Program.cs b/ConsoleApp1/Program.cs
index 727495ba..017fc129 100644
--- a/ConsoleApp1/Program.cs
+++ b/ConsoleApp1/Program.cs
@@ -19,7 +19,7 @@ namespace ConsoleApp1
     {
         static void Main(/*string[] args*/)
         {
-            ControllerLoadTester.TestControllerRoute();
+            DbDemoDataService.AddDemoData();
             //.GetAwaiter().GetResult();
 
             Console.WriteLine("End of Test");