From 031ff8c7477b09c40444e5e8176afa5b09170391 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A4=D1=80=D0=BE=D0=BB=D0=BE=D0=B2?= Date: Fri, 1 Oct 2021 17:37:44 +0500 Subject: [PATCH 1/2] Add migration. Set Telemetry forign keys on delete - cascade. --- ...Telemetry_FKs_OnDelete_Cascade.Designer.cs | 2371 +++++++++++++++++ ...1146_Set_Telemetry_FKs_OnDelete_Cascade.cs | 133 + .../AsbCloudDbContextModelSnapshot.cs | 59 +- AsbCloudDb/Model/AsbCloudDbContext.cs | 13 +- .../Services/TelemetryService.cs | 5 +- AsbCloudWebApi/DependencyInjection.cs | 2 - 6 files changed, 2547 insertions(+), 36 deletions(-) create mode 100644 AsbCloudDb/Migrations/20211001121146_Set_Telemetry_FKs_OnDelete_Cascade.Designer.cs create mode 100644 AsbCloudDb/Migrations/20211001121146_Set_Telemetry_FKs_OnDelete_Cascade.cs diff --git a/AsbCloudDb/Migrations/20211001121146_Set_Telemetry_FKs_OnDelete_Cascade.Designer.cs b/AsbCloudDb/Migrations/20211001121146_Set_Telemetry_FKs_OnDelete_Cascade.Designer.cs new file mode 100644 index 00000000..7e68739a --- /dev/null +++ b/AsbCloudDb/Migrations/20211001121146_Set_Telemetry_FKs_OnDelete_Cascade.Designer.cs @@ -0,0 +1,2371 @@ +// +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("20211001121146_Set_Telemetry_FKs_OnDelete_Cascade")] + partial class Set_Telemetry_FKs_OnDelete_Cascade + { + 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("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Caption") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.Property("IdDeposit") + .HasColumnType("integer") + .HasColumnName("id_deposit"); + + b.Property("Latitude") + .HasColumnType("double precision") + .HasColumnName("latitude"); + + b.Property("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("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Caption") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption"); + + b.Property("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("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("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("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Caption") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption"); + + b.Property("Latitude") + .HasColumnType("double precision") + .HasColumnName("latitude"); + + b.Property("Longitude") + .HasColumnType("double precision") + .HasColumnName("longitude"); + + b.HasKey("Id"); + + b.ToTable("t_deposit"); + + b + .HasComment("Месторождение"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileCategory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название категории"); + + b.Property("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("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("IdAuthor") + .HasColumnType("integer") + .HasColumnName("id_author") + .HasComment("Id пользователя, загрузившего файл"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("id категории файла"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("id скважины"); + + b.Property("IsDeleted") + .HasColumnType("boolean") + .HasColumnName("is_deleted") + .HasComment("Удален ли файл"); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название файла"); + + b.Property("Size") + .HasColumnType("bigint") + .HasColumnName("file_size") + .HasComment("Размер файла"); + + b.Property("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.Measure", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property>("Data") + .HasColumnType("jsonb") + .HasColumnName("data") + .HasComment("Данные таблицы последних данных"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("id категории"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("id скважины"); + + b.Property("IsDeleted") + .HasColumnType("boolean") + .HasColumnName("is_deleted") + .HasComment("Пометка удаленным"); + + b.Property("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("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название категории"); + + b.Property("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.RelationCompanyWell", b => + { + b.Property("IdCompany") + .HasColumnType("integer") + .HasColumnName("id_company"); + + b.Property("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.ReportProperty", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Begin") + .HasColumnType("timestamp with time zone") + .HasColumnName("begin"); + + b.Property("End") + .HasColumnType("timestamp with time zone") + .HasColumnName("end") + .HasComment("timestamp with time zone"); + + b.Property("Format") + .HasColumnType("integer") + .HasColumnName("format") + .HasComment("Формат отчета"); + + b.Property("IdFile") + .HasColumnType("integer") + .HasColumnName("id_file") + .HasComment("id файла-родителя"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("id скважины"); + + b.Property("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.Telemetry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Info") + .HasColumnType("jsonb") + .HasColumnName("info") + .HasComment("Информация с панели о скважине"); + + b.Property("RemoteUid") + .HasColumnType("text") + .HasColumnName("remote_uid") + .HasComment("Идентификатор передающего устройства. Может повторяться в списке, так как комплекты оборудования переезжают от скв. к скв."); + + 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("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("DurationSec") + .HasColumnType("integer") + .HasColumnName("duration_sec") + .HasComment("Кол-во секунд после предыдущей операции"); + + b.Property("IdOperation") + .HasColumnType("integer") + .HasColumnName("id_operation"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IsBitPositionDecreasing") + .HasColumnType("boolean") + .HasColumnName("is_bit_position_decreasing") + .HasComment("Долото поднимается"); + + b.Property("IsBitPositionIncreasing") + .HasColumnType("boolean") + .HasColumnName("is_bit_position_increasing") + .HasComment("Долото спускается"); + + b.Property("IsBitPositionLt20") + .HasColumnType("boolean") + .HasColumnName("is_bit_posision_lt_20") + .HasComment("Положение долота меньше 20м"); + + b.Property("IsBlockPositionDecreasing") + .HasColumnType("boolean") + .HasColumnName("is_block_posision_decresing") + .HasComment("Талевый блок поднимается"); + + b.Property("IsBlockPositionIncreasing") + .HasColumnType("boolean") + .HasColumnName("is_block_posision_incresing") + .HasComment("Талевый блок спускается"); + + b.Property("IsHookWeightLt3") + .HasColumnType("boolean") + .HasColumnName("is_hook_weight_lt_3") + .HasComment("Вес на крюке менее 3т"); + + b.Property("IsHookWeightNotChanges") + .HasColumnType("boolean") + .HasColumnName("is_hook_weight_not_changes") + .HasComment("Вес на крюке не меняется"); + + b.Property("IsPressureGt20") + .HasColumnType("boolean") + .HasColumnName("is_pressure_gt_20") + .HasComment("Давоение более 20"); + + b.Property("IsPressureLt20") + .HasColumnType("boolean") + .HasColumnName("is_pressure_lt_20") + .HasComment("Давление менее 20"); + + b.Property("IsRotorSpeedGt5") + .HasColumnType("boolean") + .HasColumnName("is_rotor_speed_gt_3") + .HasComment("Обороты ротора выше 3"); + + b.Property("IsRotorSpeedLt5") + .HasColumnType("boolean") + .HasColumnName("is_rotor_speed_lt_3") + .HasComment("Обороты ротора ниже 3"); + + b.Property("IsWellDepthDecreasing") + .HasColumnType("boolean") + .HasColumnName("is_well_depth_decreasing") + .HasComment("Глубина забоя не увеличивается"); + + b.Property("IsWellDepthIncreasing") + .HasColumnType("boolean") + .HasColumnName("is_well_depth_increasing") + .HasComment("Глубина забоя увеличивается"); + + b.Property("OperationEndDepth") + .HasColumnType("double precision") + .HasColumnName("operation_end_depth") + .HasComment("Глубина, на которой закончилась операция"); + + b.Property("OperationStartDepth") + .HasColumnType("double precision") + .HasColumnName("operation_start_depth") + .HasComment("Глубина, на которой началась операция"); + + b.Property("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("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("AxialLoad") + .HasColumnType("double precision") + .HasColumnName("axial_load") + .HasComment("Осевая нагрузка"); + + b.Property("AxialLoadLimitMax") + .HasColumnType("double precision") + .HasColumnName("axial_load_limit_max") + .HasComment("Осевая нагрузка. Аварийная макс."); + + b.Property("AxialLoadSp") + .HasColumnType("double precision") + .HasColumnName("axial_load_sp") + .HasComment("Осевая нагрузка. Задание"); + + b.Property("BitDepth") + .HasColumnType("double precision") + .HasColumnName("bit_depth") + .HasComment("Положение инструмента"); + + b.Property("BlockPosition") + .HasColumnType("double precision") + .HasColumnName("block_position") + .HasComment("Высота талевого блока"); + + b.Property("BlockPositionMax") + .HasColumnType("double precision") + .HasColumnName("block_position_max") + .HasComment("Талевый блок. Макс положение"); + + b.Property("BlockPositionMin") + .HasColumnType("double precision") + .HasColumnName("block_position_min") + .HasComment("Талевый блок. Мин положение"); + + b.Property("BlockSpeed") + .HasColumnType("double precision") + .HasColumnName("block_speed") + .HasComment("Скорость талевого блока"); + + b.Property("BlockSpeedSp") + .HasColumnType("double precision") + .HasColumnName("block_speed_sp") + .HasComment("Скорости талевого блока. Задание"); + + b.Property("BlockSpeedSpDevelop") + .HasColumnType("double precision") + .HasColumnName("block_speed_sp_develop") + .HasComment("Талевый блок. Задание скорости для проработки"); + + b.Property("BlockSpeedSpRotor") + .HasColumnType("double precision") + .HasColumnName("block_speed_sp_rotor") + .HasComment("Талевый блок. Задание скорости для роторного бурения"); + + b.Property("BlockSpeedSpSlide") + .HasColumnType("double precision") + .HasColumnName("block_speed_sp_slide") + .HasComment("Талевый блок. Задание скорости для режима слайда"); + + b.Property("Date") + .HasColumnType("timestamp with time zone") + .HasColumnName("date") + .HasComment("'2021-10-19 18:23:54+05'"); + + b.Property("Flow") + .HasColumnType("double precision") + .HasColumnName("flow") + .HasComment("Расход"); + + b.Property("FlowDeltaLimitMax") + .HasColumnType("double precision") + .HasColumnName("flow_delta_limit_max") + .HasComment("Расход. Аварийный макс."); + + b.Property("FlowIdle") + .HasColumnType("double precision") + .HasColumnName("flow_idle") + .HasComment("Расход. Холостой ход"); + + b.Property("HookWeight") + .HasColumnType("double precision") + .HasColumnName("hook_weight") + .HasComment("Вес на крюке"); + + b.Property("HookWeightIdle") + .HasColumnType("double precision") + .HasColumnName("hook_weight_idle") + .HasComment("Вес на крюке. Холостой ход"); + + b.Property("HookWeightLimitMax") + .HasColumnType("double precision") + .HasColumnName("hook_weight_limit_max") + .HasComment("Вес на крюке. Затяжка"); + + b.Property("HookWeightLimitMin") + .HasColumnType("double precision") + .HasColumnName("hook_weight_limit_min") + .HasComment("Вес на крюке. Посадка"); + + b.Property("IdFeedRegulator") + .HasColumnType("double precision") + .HasColumnName("id_feed_regulator") + .HasComment("Текущий критерий бурения"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("Пользователь САУБ"); + + b.Property("Mode") + .HasColumnType("integer") + .HasColumnName("mode") + .HasComment("Режим САУБ"); + + b.Property("MseState") + .HasColumnType("double precision") + .HasColumnName("mse_state") + .HasComment("Текущее состояние работы MSE"); + + b.Property("Pressure") + .HasColumnType("double precision") + .HasColumnName("pressure") + .HasComment("Давление"); + + b.Property("PressureDeltaLimitMax") + .HasColumnType("double precision") + .HasColumnName("pressure_delta_limit_max") + .HasComment("Давление дифф. Аварийное макс."); + + b.Property("PressureIdle") + .HasColumnType("double precision") + .HasColumnName("pressure_idle") + .HasComment("Давление. Холостой ход"); + + b.Property("PressureSp") + .HasColumnType("double precision") + .HasColumnName("pressure_sp") + .HasComment("Давление. Задание"); + + b.Property("PressureSpDevelop") + .HasColumnType("double precision") + .HasColumnName("pressure_sp_develop") + .HasComment("Давление. Задание для проработки"); + + b.Property("PressureSpRotor") + .HasColumnType("double precision") + .HasColumnName("pressure_sp_rotor") + .HasComment("Давление. Задание для роторного бурения"); + + b.Property("PressureSpSlide") + .HasColumnType("double precision") + .HasColumnName("pressure_sp_slide") + .HasComment("Давление. Задание для режима слайда"); + + b.Property("RotorSpeed") + .HasColumnType("double precision") + .HasColumnName("rotor_speed") + .HasComment("Обороты ротора"); + + b.Property("RotorTorque") + .HasColumnType("double precision") + .HasColumnName("rotor_torque") + .HasComment("Момент на роторе"); + + b.Property("RotorTorqueIdle") + .HasColumnType("double precision") + .HasColumnName("rotor_torque_idle") + .HasComment("Момент на роторе. Холостой ход"); + + b.Property("RotorTorqueLimitMax") + .HasColumnType("double precision") + .HasColumnName("rotor_torque_limit_max") + .HasComment("Момент на роторе. Аварийный макс."); + + b.Property("RotorTorqueSp") + .HasColumnType("double precision") + .HasColumnName("rotor_torque_sp") + .HasComment("Момент на роторе. Задание"); + + b.Property("WellDepth") + .HasColumnType("double precision") + .HasColumnName("well_depth") + .HasComment("Глубина забоя"); + + b.HasKey("Id"); + + b.HasIndex("IdTelemetry"); + + b.ToTable("t_telemetry_data_saub"); + + b + .HasComment("набор основных данных по SAUB"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSpin", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("BreakAngleK") + .HasColumnType("double precision") + .HasColumnName("break_angle_k") + .HasComment("Коэффициент для расчёта за какой угол нужно тормозить"); + + b.Property("BreakAngleLeft") + .HasColumnType("double precision") + .HasColumnName("break_angle_left") + .HasComment("Угол торможения влево при работе по моменту"); + + b.Property("Date") + .HasColumnType("timestamp with time zone") + .HasColumnName("date") + .HasComment("'2021-10-19 18:23:54+05'"); + + b.Property("EncoderResolution") + .HasColumnType("double precision") + .HasColumnName("encoder_resolution ") + .HasComment(" Разрешение энкодера"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("Mode") + .HasColumnType("integer") + .HasColumnName("mode") + .HasComment("Выбранный режим управления"); + + b.Property("PidMuxTorqueLeftLimit") + .HasColumnType("double precision") + .HasColumnName("pid_mux_torque_left_limit") + .HasComment(" Момент при котором определяется ехать назад по моменту или по скорости"); + + b.Property("PositionRight") + .HasColumnType("double precision") + .HasColumnName("position_right") + .HasComment("Крайний правый угол осциляции"); + + b.Property("PositionZero") + .HasColumnType("double precision") + .HasColumnName("position_zero") + .HasComment("Нулевая позиция осциляции"); + + b.Property("Ratio") + .HasColumnType("double precision") + .HasColumnName("ratio") + .HasComment(" Коэффициент редукции редектора"); + + b.Property("ReverseKTorque") + .HasColumnType("double precision") + .HasColumnName("reverse_k_torque") + .HasComment("Коэффициент на который умножается момент, для того чтобы система поняла что мы движемся в обратную сторону"); + + b.Property("ReverseSpeedSpZeroTime") + .HasColumnType("integer") + .HasColumnName("reverse_speed_sp_zero_time") + .HasComment("Время выдачи сигнала нулевой скорости на при смене направления"); + + b.Property("RevolsLeftLimit") + .HasColumnType("double precision") + .HasColumnName("revols_left_limit") + .HasComment("Ограничение числа оборотов влево"); + + b.Property("RevolsLeftTotal") + .HasColumnType("double precision") + .HasColumnName("revols_left_total") + .HasComment("Суммарное количество оборотов влево"); + + b.Property("RevolsRightLimit") + .HasColumnType("double precision") + .HasColumnName("revols_right_limit") + .HasComment("Ограничение числа оборотов вправо"); + + b.Property("RevolsRightTotal") + .HasColumnType("double precision") + .HasColumnName("revols_right_total") + .HasComment("Суммарное количество оборотов вправо"); + + b.Property("RotorTorqueAvg") + .HasColumnType("double precision") + .HasColumnName("rotor_torque_avg") + .HasComment(" Момент в роторе средний"); + + b.Property("SpeedLeftSp") + .HasColumnType("double precision") + .HasColumnName("speed_left_sp") + .HasComment("Заданная скорость вращения влево"); + + b.Property("SpeedRightSp") + .HasColumnType("double precision") + .HasColumnName("speed_right_sp") + .HasComment("Заданная скорость вращения вправо"); + + b.Property("State") + .HasColumnType("integer") + .HasColumnName("state") + .HasComment("Переменная этапа"); + + b.Property("TopDriveSpeed") + .HasColumnType("double precision") + .HasColumnName("top_drive_speed") + .HasComment("Скорость СВП"); + + b.Property("TopDriveSpeedErr") + .HasColumnType("integer") + .HasColumnName("top_drive_speed_err"); + + b.Property("TopDriveSpeedMax") + .HasColumnType("double precision") + .HasColumnName("top_drive_speed_max") + .HasComment("верхний предел"); + + b.Property("TopDriveSpeedMin") + .HasColumnType("double precision") + .HasColumnName("top_drive_speed_min") + .HasComment("нижний предел"); + + b.Property("TopDriveSpeedOffset") + .HasColumnType("double precision") + .HasColumnName("top_drive_speed_offset") + .HasComment("смещение"); + + b.Property("TopDriveSpeedSpFrom") + .HasColumnType("double precision") + .HasColumnName("top_drive_speed_sp_from") + .HasComment("Заданная скорость c СВП"); + + b.Property("TopDriveSpeedSpFromErr") + .HasColumnType("integer") + .HasColumnName("top_drive_speed_sp_from_err"); + + b.Property("TopDriveSpeedSpFromMax") + .HasColumnType("double precision") + .HasColumnName("top_drive_speed_sp_from_max"); + + b.Property("TopDriveSpeedSpFromMin") + .HasColumnType("double precision") + .HasColumnName("top_drive_speed_sp_from_min"); + + b.Property("TopDriveSpeedSpFromOffset") + .HasColumnType("double precision") + .HasColumnName("top_drive_speed_sp_from_offset"); + + b.Property("TopDriveSpeedSpTo") + .HasColumnType("double precision") + .HasColumnName("top_drive_speed_sp_to") + .HasComment("Задание скорости на СВП"); + + b.Property("TopDriveSpeedSpToErr") + .HasColumnType("integer") + .HasColumnName("top_drive_speed_sp_to_err"); + + b.Property("TopDriveSpeedSpToMax") + .HasColumnType("double precision") + .HasColumnName("top_drive_speed_sp_to_max"); + + b.Property("TopDriveSpeedSpToMin") + .HasColumnType("double precision") + .HasColumnName("top_drive_speed_sp_to_min"); + + b.Property("TopDriveSpeedSpToOffset") + .HasColumnType("double precision") + .HasColumnName("top_drive_speed_sp_to_offset"); + + b.Property("TopDriveTorque") + .HasColumnType("double precision") + .HasColumnName("top_drive_torque") + .HasComment("Момент СВП"); + + b.Property("TopDriveTorqueErr") + .HasColumnType("integer") + .HasColumnName("top_drive_torque_err"); + + b.Property("TopDriveTorqueMax") + .HasColumnType("double precision") + .HasColumnName("top_drive_torque_max"); + + b.Property("TopDriveTorqueMin") + .HasColumnType("double precision") + .HasColumnName("top_drive_torque_min"); + + b.Property("TopDriveTorqueOffset") + .HasColumnType("double precision") + .HasColumnName("top_drive_torque_offset"); + + b.Property("TopDriveTorqueSpFrom") + .HasColumnType("double precision") + .HasColumnName("top_drive_torque_sp_from") + .HasComment("Заданный момент c СВП"); + + b.Property("TopDriveTorqueSpFromErr") + .HasColumnType("integer") + .HasColumnName("top_drive_torque_sp_from_err"); + + b.Property("TopDriveTorqueSpFromMax") + .HasColumnType("double precision") + .HasColumnName("top_drive_torque_sp_from_max"); + + b.Property("TopDriveTorqueSpFromMin") + .HasColumnType("double precision") + .HasColumnName("top_drive_torque_sp_from_min"); + + b.Property("TopDriveTorqueSpFromOffset") + .HasColumnType("double precision") + .HasColumnName("top_drive_torque_sp_from_offset"); + + b.Property("TopDriveTorqueSpTo") + .HasColumnType("double precision") + .HasColumnName("top_drive_torque_sp_to") + .HasComment("Задание момента на СВП"); + + b.Property("TopDriveTorqueSpToErr") + .HasColumnType("integer") + .HasColumnName("top_drive_torque_sp_to_err"); + + b.Property("TopDriveTorqueSpToMax") + .HasColumnType("double precision") + .HasColumnName("top_drive_torque_sp_to_max"); + + b.Property("TopDriveTorqueSpToMin") + .HasColumnType("double precision") + .HasColumnName("top_drive_torque_sp_to_min"); + + b.Property("TopDriveTorqueSpToOffset") + .HasColumnType("double precision") + .HasColumnName("top_drive_torque_sp_to_offset"); + + b.Property("TorqueLeftLimit") + .HasColumnType("double precision") + .HasColumnName("torque_left_limit") + .HasComment("Ограничение крутящего момента влево"); + + b.Property("TorqueRampTime") + .HasColumnType("double precision") + .HasColumnName("torque_ramp_time") + .HasComment("Время нарастания момента"); + + b.Property("TorqueRightLimit") + .HasColumnType("double precision") + .HasColumnName("torque_right_limit") + .HasComment("Ограничение крутящего момента вправо"); + + b.Property("TorqueStarting") + .HasColumnType("double precision") + .HasColumnName("torque_starting") + .HasComment(" Страгивающий момент"); + + b.Property("TurnLeftOnceByAngle") + .HasColumnType("double precision") + .HasColumnName("turn_left_once_by_angle") + .HasComment("Доворот по градусам единожды влево"); + + b.Property("TurnLeftOnceByRevols") + .HasColumnType("double precision") + .HasColumnName("turn_left_once_by_revols") + .HasComment("Доворот по оборотам единожды влево"); + + b.Property("TurnLeftOnceByTorque") + .HasColumnType("double precision") + .HasColumnName("turn_left_once_by_torque") + .HasComment("Доворот по моменту единожды влево"); + + b.Property("TurnRightOnceByAngle") + .HasColumnType("double precision") + .HasColumnName("turn_right_once_by_angle") + .HasComment("Доворот по градусам единожды вправо"); + + b.Property("TurnRightOnceByRevols") + .HasColumnType("double precision") + .HasColumnName("turn_right_once_by_revols") + .HasComment("Доворот по оборотам единожды вправо"); + + b.Property("TurnRightOnceByTorque") + .HasColumnType("double precision") + .HasColumnName("turn_right_once_by_torque") + .HasComment("Доворот по моменту единожды вправо"); + + b.Property("UnlockBySectorOut") + .HasColumnType("double precision") + .HasColumnName("unlock_by_sector_out") + .HasComment(" Градус отклонения от сектора для автоматического сброса блокировки"); + + b.Property("Ver") + .HasColumnType("double precision") + .HasColumnName("ver") + .HasComment("Версия ПО ПЛК"); + + b.Property("W2800") + .HasColumnType("integer") + .HasColumnName("w2800") + .HasComment("Установка нуля энкодера"); + + b.Property("W2808") + .HasColumnType("integer") + .HasColumnName("w2808") + .HasComment("Неисправность энкодера"); + + b.Property("W2810") + .HasColumnType("integer") + .HasColumnName("w2810") + .HasComment(" автоматический сброс блокировки"); + + b.HasKey("Id"); + + b.HasIndex("IdTelemetry"); + + b.ToTable("t_telemetry_data_spin"); + + b + .HasComment("набор основных данных по SpinMaster"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryEvent", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdEvent") + .HasColumnType("integer") + .HasColumnName("id_event"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category"); + + b.Property("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("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Arg0") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("arg0") + .HasComment("Аргумент №0 для вставки в шаблон сообщения"); + + b.Property("Arg1") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("arg1"); + + b.Property("Arg2") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("arg2"); + + b.Property("Arg3") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("arg3"); + + b.Property("Date") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.Property("IdEvent") + .HasColumnType("integer") + .HasColumnName("id_event"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdTelemetryUser") + .HasColumnType("integer") + .HasColumnName("id_telemetry_user") + .HasComment("Пользователь панели отправляющей телеметрию. не пользователь облака."); + + b.Property("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("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("Level") + .HasColumnType("integer") + .HasColumnName("level"); + + b.Property("Name") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name"); + + b.Property("Patronymic") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("patronymic"); + + b.Property("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("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Email") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("email") + .HasComment("должность"); + + b.Property("IdCompany") + .HasColumnType("integer") + .HasColumnName("id_company"); + + b.Property("IdRole") + .HasColumnType("integer") + .HasColumnName("id_role"); + + b.Property("Level") + .HasColumnType("integer") + .HasColumnName("level"); + + b.Property("Login") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("login"); + + b.Property("Name") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name") + .HasComment("имя"); + + b.Property("PasswordHash") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("password_hash") + .HasComment("соленый хэш пароля.\nпервые 5 символов - соль"); + + b.Property("Patronymic") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("patronymic") + .HasComment("отчество"); + + b.Property("Phone") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("phone") + .HasComment("номер телефона"); + + b.Property("Position") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("position") + .HasComment("email"); + + b.Property("State") + .HasColumnType("smallint") + .HasColumnName("state") + .HasComment("состояние:\n100 - удален"); + + b.Property("Surname") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("surname") + .HasComment("фамилия"); + + b.HasKey("Id"); + + b.HasIndex("IdCompany"); + + b.HasIndex("IdRole"); + + b.HasIndex("Login") + .IsUnique(); + + b.ToTable("t_user"); + + b + .HasComment("Пользователи облака"); + + b.HasData( + new + { + Id = 1, + IdCompany = 1, + IdRole = 1, + Level = 2147483647, + Login = "dev", + Name = "Разработчик", + PasswordHash = "Vlcj|4fa529103dde7ff72cfe76185f344d4aa87931f8e1b2044e8a7739947c3d18923464eaad93843e4f809c5e126d013072" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.UserRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Caption") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.HasKey("Id"); + + b.ToTable("t_user_role"); + + b + .HasComment("Роли пользователей в системе"); + + b.HasData( + new + { + Id = 1, + Caption = "Администратор" + }, + new + { + Id = 2, + Caption = "Пользователь" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Well", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Caption") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption"); + + b.Property("IdCluster") + .HasColumnType("integer") + .HasColumnName("id_cluster"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdWellType") + .HasColumnType("integer") + .HasColumnName("id_well_type"); + + b.Property("Latitude") + .HasColumnType("double precision") + .HasColumnName("latitude"); + + b.Property("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.WellOperation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("CategoryInfo") + .HasColumnType("text") + .HasColumnName("category_info") + .HasComment("Доп. информация к выбраной категории"); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("Комментарий"); + + b.Property("DurationHours") + .HasColumnType("double precision") + .HasColumnName("duration_hours") + .HasComment("Продолжительность в часах"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("Id категории операции"); + + b.Property("IdType") + .HasColumnType("integer") + .HasColumnName("id_type") + .HasComment("0 = План или 1 = Факт"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины"); + + b.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_well_section_type") + .HasComment("Id тип секции скважины"); + + b.Property("StartDate") + .HasColumnType("timestamp without time zone") + .HasColumnName("date") + .HasComment("Дата начала операции"); + + b.Property("WellDepth") + .HasColumnType("double precision") + .HasColumnName("depth") + .HasComment("Глубина, на которой производилась операция"); + + b.HasKey("Id"); + + b.HasIndex("IdCategory"); + + b.HasIndex("IdWell"); + + b.HasIndex("IdWellSectionType"); + + b.HasIndex("StartDate"); + + b.HasIndex("WellDepth"); + + b.ToTable("t_well_operation"); + + b + .HasComment("Данные по операциям на скважине"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellOperationCategory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Code") + .HasColumnType("integer") + .HasColumnName("code") + .HasComment("Код операции"); + + b.Property("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 = 1009, + Code = 0, + Name = "Оборудование устья" + }, + new + { + Id = 1010, + 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 = 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 = 1036, + 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 = "Промывка при спуске ОК" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellSectionType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("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("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("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.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.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.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.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.HasOne("AsbCloudDb.Model.UserRole", "Role") + .WithMany("Users") + .HasForeignKey("IdRole"); + + b.Navigation("Company"); + + b.Navigation("Role"); + }); + + 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.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.MeasureCategory", b => + { + b.Navigation("Measures"); + }); + + 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("Files"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.UserRole", b => + { + b.Navigation("Users"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Well", b => + { + b.Navigation("RelationCompaniesWells"); + + b.Navigation("WellOperations"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellOperationCategory", b => + { + b.Navigation("Analysis"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellSectionType", b => + { + b.Navigation("WellOperations"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellType", b => + { + b.Navigation("Wells"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/AsbCloudDb/Migrations/20211001121146_Set_Telemetry_FKs_OnDelete_Cascade.cs b/AsbCloudDb/Migrations/20211001121146_Set_Telemetry_FKs_OnDelete_Cascade.cs new file mode 100644 index 00000000..ea4b61ae --- /dev/null +++ b/AsbCloudDb/Migrations/20211001121146_Set_Telemetry_FKs_OnDelete_Cascade.cs @@ -0,0 +1,133 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace AsbCloudDb.Migrations +{ + public partial class Set_Telemetry_FKs_OnDelete_Cascade : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "t_telemetry_data_saub_t_telemetry_id_fk", + table: "t_telemetry_data_saub"); + + migrationBuilder.DropForeignKey( + name: "t_telemetry_data_spin_t_telemetry_id_fk", + table: "t_telemetry_data_spin"); + + migrationBuilder.DropForeignKey( + name: "t_telemetry_user_t_telemetry_id_fk", + table: "t_telemetry_user"); + + migrationBuilder.DropForeignKey( + name: "t_user_t_company_id_fk", + table: "t_user"); + + migrationBuilder.DropForeignKey( + name: "t_well_t_telemetry_id_fk", + table: "t_well"); + + migrationBuilder.AddForeignKey( + name: "t_telemetry_data_saub_t_telemetry_id_fk", + table: "t_telemetry_data_saub", + column: "id_telemetry", + principalTable: "t_telemetry", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "t_telemetry_data_spin_t_telemetry_id_fk", + table: "t_telemetry_data_spin", + column: "id_telemetry", + principalTable: "t_telemetry", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "t_telemetry_user_t_telemetry_id_fk", + table: "t_telemetry_user", + column: "id_telemetry", + principalTable: "t_telemetry", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "t_user_t_company_id_fk", + table: "t_user", + column: "id_company", + principalTable: "t_company", + principalColumn: "id", + onDelete: ReferentialAction.SetNull); + + migrationBuilder.AddForeignKey( + name: "t_well_t_telemetry_id_fk", + table: "t_well", + column: "id_telemetry", + principalTable: "t_telemetry", + principalColumn: "id", + onDelete: ReferentialAction.SetNull); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "t_telemetry_data_saub_t_telemetry_id_fk", + table: "t_telemetry_data_saub"); + + migrationBuilder.DropForeignKey( + name: "t_telemetry_data_spin_t_telemetry_id_fk", + table: "t_telemetry_data_spin"); + + migrationBuilder.DropForeignKey( + name: "t_telemetry_user_t_telemetry_id_fk", + table: "t_telemetry_user"); + + migrationBuilder.DropForeignKey( + name: "t_user_t_company_id_fk", + table: "t_user"); + + migrationBuilder.DropForeignKey( + name: "t_well_t_telemetry_id_fk", + table: "t_well"); + + migrationBuilder.AddForeignKey( + name: "t_telemetry_data_saub_t_telemetry_id_fk", + table: "t_telemetry_data_saub", + column: "id_telemetry", + principalTable: "t_telemetry", + principalColumn: "id", + onDelete: ReferentialAction.Restrict); + + migrationBuilder.AddForeignKey( + name: "t_telemetry_data_spin_t_telemetry_id_fk", + table: "t_telemetry_data_spin", + column: "id_telemetry", + principalTable: "t_telemetry", + principalColumn: "id", + onDelete: ReferentialAction.Restrict); + + migrationBuilder.AddForeignKey( + name: "t_telemetry_user_t_telemetry_id_fk", + table: "t_telemetry_user", + column: "id_telemetry", + principalTable: "t_telemetry", + principalColumn: "id", + onDelete: ReferentialAction.Restrict); + + migrationBuilder.AddForeignKey( + name: "t_user_t_company_id_fk", + table: "t_user", + column: "id_company", + principalTable: "t_company", + principalColumn: "id", + onDelete: ReferentialAction.Restrict); + + migrationBuilder.AddForeignKey( + name: "t_well_t_telemetry_id_fk", + table: "t_well", + column: "id_telemetry", + principalTable: "t_telemetry", + principalColumn: "id", + onDelete: ReferentialAction.Restrict); + } + } +} diff --git a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs index 38840fdf..94056f91 100644 --- a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs +++ b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs @@ -17,10 +17,10 @@ namespace AsbCloudDb.Migrations #pragma warning disable 612, 618 modelBuilder .HasPostgresExtension("adminpack") - .UseIdentityByDefaultColumns() .HasAnnotation("Relational:Collation", "Russian_Russia.1251") .HasAnnotation("Relational:MaxIdentifierLength", 63) - .HasAnnotation("ProductVersion", "5.0.2"); + .HasAnnotation("ProductVersion", "5.0.10") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => { @@ -28,7 +28,7 @@ namespace AsbCloudDb.Migrations .ValueGeneratedOnAdd() .HasColumnType("integer") .HasColumnName("id") - .UseIdentityByDefaultColumn(); + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); b.Property("Caption") .HasMaxLength(255) @@ -64,7 +64,7 @@ namespace AsbCloudDb.Migrations .ValueGeneratedOnAdd() .HasColumnType("integer") .HasColumnName("id") - .UseIdentityByDefaultColumn(); + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); b.Property("Caption") .HasMaxLength(255) @@ -98,7 +98,7 @@ namespace AsbCloudDb.Migrations .ValueGeneratedOnAdd() .HasColumnType("integer") .HasColumnName("id") - .UseIdentityByDefaultColumn(); + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); b.Property("Caption") .HasMaxLength(255) @@ -133,7 +133,7 @@ namespace AsbCloudDb.Migrations .ValueGeneratedOnAdd() .HasColumnType("integer") .HasColumnName("id") - .UseIdentityByDefaultColumn(); + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); b.Property("Caption") .HasMaxLength(255) @@ -162,7 +162,7 @@ namespace AsbCloudDb.Migrations .ValueGeneratedOnAdd() .HasColumnType("integer") .HasColumnName("id") - .UseIdentityByDefaultColumn(); + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); b.Property("Name") .HasColumnType("text") @@ -274,7 +274,7 @@ namespace AsbCloudDb.Migrations .ValueGeneratedOnAdd() .HasColumnType("integer") .HasColumnName("id") - .UseIdentityByDefaultColumn(); + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); b.Property("IdAuthor") .HasColumnType("integer") @@ -330,7 +330,7 @@ namespace AsbCloudDb.Migrations .ValueGeneratedOnAdd() .HasColumnType("integer") .HasColumnName("id") - .UseIdentityByDefaultColumn(); + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); b.Property>("Data") .HasColumnType("jsonb") @@ -375,7 +375,7 @@ namespace AsbCloudDb.Migrations .ValueGeneratedOnAdd() .HasColumnType("integer") .HasColumnName("id") - .UseIdentityByDefaultColumn(); + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); b.Property("Name") .HasColumnType("text") @@ -441,7 +441,7 @@ namespace AsbCloudDb.Migrations .ValueGeneratedOnAdd() .HasColumnType("integer") .HasColumnName("id") - .UseIdentityByDefaultColumn(); + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); b.Property("Begin") .HasColumnType("timestamp with time zone") @@ -490,7 +490,7 @@ namespace AsbCloudDb.Migrations .ValueGeneratedOnAdd() .HasColumnType("integer") .HasColumnName("id") - .UseIdentityByDefaultColumn(); + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); b.Property("Info") .HasColumnType("jsonb") @@ -518,7 +518,7 @@ namespace AsbCloudDb.Migrations .ValueGeneratedOnAdd() .HasColumnType("integer") .HasColumnName("id") - .UseIdentityByDefaultColumn(); + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); b.Property("DurationSec") .HasColumnType("integer") @@ -578,12 +578,12 @@ namespace AsbCloudDb.Migrations .HasColumnName("is_pressure_lt_20") .HasComment("Давление менее 20"); - b.Property("IsRotorSpeedGt3") + b.Property("IsRotorSpeedGt5") .HasColumnType("boolean") .HasColumnName("is_rotor_speed_gt_3") .HasComment("Обороты ротора выше 3"); - b.Property("IsRotorSpeedLt3") + b.Property("IsRotorSpeedLt5") .HasColumnType("boolean") .HasColumnName("is_rotor_speed_lt_3") .HasComment("Обороты ротора ниже 3"); @@ -631,7 +631,7 @@ namespace AsbCloudDb.Migrations .ValueGeneratedOnAdd() .HasColumnType("integer") .HasColumnName("id") - .UseIdentityByDefaultColumn(); + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); b.Property("AxialLoad") .HasColumnType("double precision") @@ -838,7 +838,7 @@ namespace AsbCloudDb.Migrations .ValueGeneratedOnAdd() .HasColumnType("integer") .HasColumnName("id") - .UseIdentityByDefaultColumn(); + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); b.Property("BreakAngleK") .HasColumnType("double precision") @@ -1185,7 +1185,7 @@ namespace AsbCloudDb.Migrations .ValueGeneratedOnAdd() .HasColumnType("integer") .HasColumnName("id") - .UseIdentityByDefaultColumn(); + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); b.Property("Arg0") .HasMaxLength(255) @@ -1282,7 +1282,7 @@ namespace AsbCloudDb.Migrations .ValueGeneratedOnAdd() .HasColumnType("integer") .HasColumnName("id") - .UseIdentityByDefaultColumn(); + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); b.Property("Email") .HasMaxLength(255) @@ -1381,7 +1381,7 @@ namespace AsbCloudDb.Migrations .ValueGeneratedOnAdd() .HasColumnType("integer") .HasColumnName("id") - .UseIdentityByDefaultColumn(); + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); b.Property("Caption") .HasMaxLength(255) @@ -1415,7 +1415,7 @@ namespace AsbCloudDb.Migrations .ValueGeneratedOnAdd() .HasColumnType("integer") .HasColumnName("id") - .UseIdentityByDefaultColumn(); + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); b.Property("Caption") .HasMaxLength(255) @@ -1463,7 +1463,7 @@ namespace AsbCloudDb.Migrations .ValueGeneratedOnAdd() .HasColumnType("integer") .HasColumnName("id") - .UseIdentityByDefaultColumn(); + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); b.Property("CategoryInfo") .HasColumnType("text") @@ -1534,7 +1534,7 @@ namespace AsbCloudDb.Migrations .ValueGeneratedOnAdd() .HasColumnType("integer") .HasColumnName("id") - .UseIdentityByDefaultColumn(); + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); b.Property("Code") .HasColumnType("integer") @@ -1952,7 +1952,7 @@ namespace AsbCloudDb.Migrations .ValueGeneratedOnAdd() .HasColumnType("integer") .HasColumnName("id") - .UseIdentityByDefaultColumn(); + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); b.Property("Caption") .HasMaxLength(255) @@ -2006,7 +2006,7 @@ namespace AsbCloudDb.Migrations .ValueGeneratedOnAdd() .HasColumnType("integer") .HasColumnName("id") - .UseIdentityByDefaultColumn(); + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); b.Property("Caption") .HasMaxLength(255) @@ -2166,6 +2166,7 @@ namespace AsbCloudDb.Migrations .WithMany("DataSaub") .HasForeignKey("IdTelemetry") .HasConstraintName("t_telemetry_data_saub_t_telemetry_id_fk") + .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Telemetry"); @@ -2177,6 +2178,7 @@ namespace AsbCloudDb.Migrations .WithMany("DataSpin") .HasForeignKey("IdTelemetry") .HasConstraintName("t_telemetry_data_spin_t_telemetry_id_fk") + .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Telemetry"); @@ -2212,6 +2214,7 @@ namespace AsbCloudDb.Migrations .WithMany("Users") .HasForeignKey("IdTelemetry") .HasConstraintName("t_telemetry_user_t_telemetry_id_fk") + .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Telemetry"); @@ -2222,7 +2225,8 @@ namespace AsbCloudDb.Migrations b.HasOne("AsbCloudDb.Model.Company", "Company") .WithMany("Users") .HasForeignKey("IdCompany") - .HasConstraintName("t_user_t_company_id_fk"); + .HasConstraintName("t_user_t_company_id_fk") + .OnDelete(DeleteBehavior.SetNull); b.HasOne("AsbCloudDb.Model.UserRole", "Role") .WithMany("Users") @@ -2243,7 +2247,8 @@ namespace AsbCloudDb.Migrations b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") .WithOne("Well") .HasForeignKey("AsbCloudDb.Model.Well", "IdTelemetry") - .HasConstraintName("t_well_t_telemetry_id_fk"); + .HasConstraintName("t_well_t_telemetry_id_fk") + .OnDelete(DeleteBehavior.SetNull); b.HasOne("AsbCloudDb.Model.WellType", "WellType") .WithMany("Wells") diff --git a/AsbCloudDb/Model/AsbCloudDbContext.cs b/AsbCloudDb/Model/AsbCloudDbContext.cs index c79bf892..72a5a78f 100644 --- a/AsbCloudDb/Model/AsbCloudDbContext.cs +++ b/AsbCloudDb/Model/AsbCloudDbContext.cs @@ -1,7 +1,6 @@ using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; -using System.Data.Common; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -76,7 +75,7 @@ namespace AsbCloudDb.Model entity.HasOne(d => d.Telemetry) .WithMany(p => p.DataSaub) .HasForeignKey(d => d.IdTelemetry) - .OnDelete(DeleteBehavior.ClientSetNull) + .OnDelete(DeleteBehavior.Cascade) .HasConstraintName("t_telemetry_data_saub_t_telemetry_id_fk"); }); @@ -85,7 +84,7 @@ namespace AsbCloudDb.Model entity.HasOne(d => d.Telemetry) .WithMany(p => p.DataSpin) .HasForeignKey(d => d.IdTelemetry) - .OnDelete(DeleteBehavior.ClientSetNull) + .OnDelete(DeleteBehavior.Cascade) .HasConstraintName("t_telemetry_data_spin_t_telemetry_id_fk"); }); @@ -94,6 +93,7 @@ namespace AsbCloudDb.Model entity.HasOne(d => d.Telemetry) .WithMany(p => p.Messages) .HasForeignKey(d => d.IdTelemetry) + .OnDelete(DeleteBehavior.Cascade) .HasConstraintName("t_messages_t_telemetry_id_fk"); }); @@ -103,7 +103,7 @@ namespace AsbCloudDb.Model entity.HasOne(d => d.Telemetry) .WithMany(p => p.Users) .HasForeignKey(d => d.IdTelemetry) - .OnDelete(DeleteBehavior.ClientSetNull) + .OnDelete(DeleteBehavior.Cascade) .HasConstraintName("t_telemetry_user_t_telemetry_id_fk"); }); @@ -112,6 +112,7 @@ namespace AsbCloudDb.Model entity.HasOne(d => d.Telemetry) .WithMany(p => p.Analysis) .HasForeignKey(d => d.IdTelemetry) + .OnDelete(DeleteBehavior.Cascade) .HasConstraintName("t_analysis_t_telemetry_id_fk"); entity.HasOne(d => d.Operation) @@ -127,6 +128,7 @@ namespace AsbCloudDb.Model entity.HasOne(d => d.Telemetry) .WithMany(p => p.Events) .HasForeignKey(d => d.IdTelemetry) + .OnDelete(DeleteBehavior.Cascade) .HasConstraintName("t_event_t_telemetry_id_fk"); }); @@ -135,6 +137,7 @@ namespace AsbCloudDb.Model entity.HasOne(d => d.Company) .WithMany(p => p.Users) .HasForeignKey(d => d.IdCompany) + .OnDelete(DeleteBehavior.SetNull) .HasConstraintName("t_user_t_company_id_fk"); entity.HasIndex(d => d.Login) @@ -151,12 +154,12 @@ namespace AsbCloudDb.Model entity.HasOne(d => d.Telemetry) .WithOne(p => p.Well) .HasForeignKey(d => d.IdTelemetry) + .OnDelete(DeleteBehavior.SetNull) .HasConstraintName("t_well_t_telemetry_id_fk"); }); modelBuilder.Entity(entity => { - entity.HasKey(nameof(RelationCompanyWell.IdCompany), nameof(RelationCompanyWell.IdWell)); entity.HasOne(r => r.Well) diff --git a/AsbCloudInfrastructure/Services/TelemetryService.cs b/AsbCloudInfrastructure/Services/TelemetryService.cs index e46044c0..2448c31f 100644 --- a/AsbCloudInfrastructure/Services/TelemetryService.cs +++ b/AsbCloudInfrastructure/Services/TelemetryService.cs @@ -8,6 +8,7 @@ using System.Linq; using System; using Microsoft.EntityFrameworkCore; using System.Threading.Tasks; +using System.Threading; namespace AsbCloudInfrastructure.Services { @@ -229,11 +230,11 @@ namespace AsbCloudInfrastructure.Services transaction.Commit(); sw.Stop(); - Console.WriteLine($"Successfully commited in {1d*sw.ElapsedMilliseconds/1000d: #0.00} sec."); + Console.WriteLine($"Successfully commited in {1d*sw.ElapsedMilliseconds/1000d: #0.00} sec. Affected {rows} rows."); } catch(Exception ex) { - Console.WriteLine("Fail. Rollback."); + Console.WriteLine($"Fail. Rollback. Reason is:{ex.Message}"); transaction.Rollback(); return 0; } diff --git a/AsbCloudWebApi/DependencyInjection.cs b/AsbCloudWebApi/DependencyInjection.cs index 0741aad5..ca79e085 100644 --- a/AsbCloudWebApi/DependencyInjection.cs +++ b/AsbCloudWebApi/DependencyInjection.cs @@ -17,8 +17,6 @@ namespace AsbCloudWebApi { services.AddSwaggerGen(c => { - //c.CustomOperationIds(e => $"{e.ActionDescriptor.RouteValues["controller"]}_{e.HttpMethod}"); - //c.CustomOperationIds(e => $"{e.HttpMethod}_{e.ActionDescriptor.Ac"); c.CustomOperationIds(e => { return $"{e.ActionDescriptor.RouteValues["action"]}"; From cdfcb0b2f7e51a35cfe816585bcadfec5b8b6034 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A4=D1=80=D0=BE=D0=BB=D0=BE=D0=B2?= Date: Sun, 3 Oct 2021 20:08:17 +0500 Subject: [PATCH 2/2] semaphore --- .../Services/Cache/CacheDb.cs | 7 +- .../Services/Cache/CacheTable.cs | 303 +++++++----------- .../Services/Cache/RefreshMode.cs | 4 - ConsoleApp1/Program.cs | 94 +++++- 4 files changed, 220 insertions(+), 188 deletions(-) delete mode 100644 AsbCloudInfrastructure/Services/Cache/RefreshMode.cs diff --git a/AsbCloudInfrastructure/Services/Cache/CacheDb.cs b/AsbCloudInfrastructure/Services/Cache/CacheDb.cs index a6c5baec..dcd27a58 100644 --- a/AsbCloudInfrastructure/Services/Cache/CacheDb.cs +++ b/AsbCloudInfrastructure/Services/Cache/CacheDb.cs @@ -1,5 +1,6 @@ using Microsoft.EntityFrameworkCore; using System; +using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; @@ -8,8 +9,8 @@ namespace AsbCloudInfrastructure.Services.Cache public class CacheDb { - private readonly ConcurrentDictionary cache = - new ConcurrentDictionary(); + private readonly Dictionary cache = + new Dictionary(); private readonly TimeSpan obsolesenceTime = TimeSpan.FromMinutes(15); @@ -19,7 +20,7 @@ namespace AsbCloudInfrastructure.Services.Cache var entityTypeName = typeof(TEntity).FullName; if (!cache.ContainsKey(entityTypeName)) - cache[entityTypeName] = (DateTime.Now, new ConcurrentBag()); + cache[entityTypeName] = (DateTime.Now, new List()); bool isCachedDataObsolete = DateTime.Now - cache[entityTypeName].Item1 > obsolesenceTime; diff --git a/AsbCloudInfrastructure/Services/Cache/CacheTable.cs b/AsbCloudInfrastructure/Services/Cache/CacheTable.cs index e3155e70..c70f7929 100644 --- a/AsbCloudInfrastructure/Services/Cache/CacheTable.cs +++ b/AsbCloudInfrastructure/Services/Cache/CacheTable.cs @@ -1,229 +1,180 @@ using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; -using System.Collections.Concurrent; using System.Linq; using System.Threading; using System.Threading.Tasks; +using System.Collections; +using System.Diagnostics; namespace AsbCloudInfrastructure.Services.Cache { public class CacheTable : IEnumerable where TEntity : class { + private const int semaphoreTimeout = 5_000; + private static readonly SemaphoreSlim semaphore = new(1); private readonly DbContext context; - private (DateTime refreshDate, object entities) data; - private readonly ConcurrentBag cached; + private (DateTime refreshDate, IEnumerable entities) data; + private readonly List cached; private readonly DbSet dbSet; - internal CacheTable(DbContext context, (DateTime refreshDate, object entities) data) + internal CacheTable(DbContext context, (DateTime refreshDate, IEnumerable entities) data) { this.context = context; this.data = data; - this.cached = (ConcurrentBag)data.entities; dbSet = context.Set(); + cached = (List)data.entities; + if (cached.Count == 0) + Refresh(); } public TEntity this[int index] { get => cached.ElementAt(index); } + //public static void Sync(Action) + public int Refresh() { - cached.Clear(); - - var dbEntities = context.Set().AsNoTracking().ToList(); - foreach(var e in dbEntities) - cached.Add(e); - data.refreshDate = DateTime.Now; + var wasFree = semaphore.CurrentCount > 0; + if(!semaphore.Wait(semaphoreTimeout)) + return 0; + try + { + if (wasFree) + { + cached.Clear(); + var entities = dbSet.AsNoTracking().ToList(); + cached.AddRange(entities); + data.refreshDate = DateTime.Now; + } + //else - nothing, it was just updated in another thread + } + catch (Exception ex) + { + Trace.WriteLine($"{DateTime.Now:yyyy.MM.dd HH:mm:ss:fff} error in CacheTable<{typeof(TEntity).Name}>.Refresh()"); + Trace.WriteLine(ex.Message); + } + finally + { + semaphore.Release(); + } return cached.Count; } public async Task RefreshAsync(CancellationToken token = default) { - cached.Clear(); - - var dbEntities = await context.Set().AsNoTracking() - .ToListAsync(token).ConfigureAwait(false); - - foreach (var e in dbEntities) - cached.Add(e); - data.refreshDate = DateTime.Now; + var wasFree = semaphore.CurrentCount > 0; + if (!await semaphore.WaitAsync(semaphoreTimeout, token).ConfigureAwait(false)) + return 0; + try + { + if (wasFree) + { + cached.Clear(); + var entities = await context.Set().AsNoTracking() + .ToListAsync(token).ConfigureAwait(false); + cached.AddRange(entities); + data.refreshDate = DateTime.Now; + } + //else - nothing, it was just updated in another thread + } + catch (Exception ex) + { + Trace.WriteLine($"{DateTime.Now:yyyy.MM.dd HH:mm:ss:fff} error in CacheTable<{typeof(TEntity).Name}>.Refresh()"); + Trace.WriteLine(ex.Message); + } + finally + { + semaphore.Release(); + } return cached.Count; } - private bool CheckRefresh(RefreshMode refreshMode) + public bool Contains(Func predicate) + => FirstOrDefault(predicate) != default; + + public async Task ContainsAsync(Func predicate, CancellationToken token = default) + => await FirstOrDefaultAsync(predicate, token) != default; + + public TEntity FirstOrDefault() { - if (refreshMode == RefreshMode.Force) - { - Refresh(); - return true; - } - - if ((refreshMode == RefreshMode.IfResultEmpty) && !cached.Any()) - { - Refresh(); - return true; - } - - return false; - } - - private async Task CheckRefreshAsync(RefreshMode refreshMode, CancellationToken token = default) - { - if (refreshMode == RefreshMode.Force) - { - await RefreshAsync(token); - return true; - } - - if (refreshMode == RefreshMode.IfResultEmpty && !cached.Any()) - { - await RefreshAsync(token); - return true; - } - - return false; - } - - public bool Contains(Func predicate, RefreshMode refreshMode = RefreshMode.IfResultEmpty) - => FirstOrDefault(predicate, refreshMode) != default; - - public Task ContainsAsync(Func predicate, CancellationToken token = default) - => ContainsAsync(predicate, RefreshMode.IfResultEmpty, token); - - public async Task ContainsAsync(Func predicate, RefreshMode refreshMode = RefreshMode.IfResultEmpty, CancellationToken token = default) - => await FirstOrDefaultAsync(predicate, refreshMode, token) != default; - - public Task FirstOrDefaultAsync(CancellationToken token = default) - => FirstOrDefaultAsync(RefreshMode.IfResultEmpty, token); - - public TEntity FirstOrDefault(RefreshMode refreshMode = RefreshMode.IfResultEmpty) - { - bool isUpdated = CheckRefresh(refreshMode); var result = cached.FirstOrDefault(); - if (result == default && refreshMode == RefreshMode.IfResultEmpty && !isUpdated) - { - Refresh(); - return cached.FirstOrDefault(); - } - return result; + if (result != default) + return result; + + Refresh(); + return cached.FirstOrDefault(); } - public async Task FirstOrDefaultAsync(RefreshMode refreshMode = RefreshMode.IfResultEmpty, CancellationToken token = default) + public async Task FirstOrDefaultAsync(CancellationToken token = default) { - bool isUpdated = await CheckRefreshAsync(refreshMode, token); var result = cached.FirstOrDefault(); - if (result == default && refreshMode == RefreshMode.IfResultEmpty && !isUpdated) - { - await RefreshAsync(token); - return cached.FirstOrDefault(); - } - return result; + if (result != default) + return result; + + await RefreshAsync(token); + return cached.FirstOrDefault(); + } - public Task FirstOrDefaultAsync(Func predicate, CancellationToken token = default) - => FirstOrDefaultAsync(predicate, RefreshMode.IfResultEmpty, token); - - public TEntity FirstOrDefault(Func predicate, RefreshMode refreshMode = RefreshMode.IfResultEmpty) + public TEntity FirstOrDefault(Func predicate) { - bool isUpdated = CheckRefresh(refreshMode); var result = cached.FirstOrDefault(predicate); - if (result == default && refreshMode == RefreshMode.IfResultEmpty && !isUpdated) - { - Refresh(); - return cached.FirstOrDefault(predicate); - } - return result; + if (result != default) + return result; + + Refresh(); + return cached.FirstOrDefault(predicate); } - public async Task FirstOrDefaultAsync(Func predicate, RefreshMode refreshMode = RefreshMode.IfResultEmpty, CancellationToken token = default) + public async Task FirstOrDefaultAsync(Func predicate, CancellationToken token = default) { - bool isUpdated = await CheckRefreshAsync(refreshMode, token); var result = cached.FirstOrDefault(predicate); - if (result == default && refreshMode == RefreshMode.IfResultEmpty && !isUpdated) - { - await RefreshAsync(token); - return cached.FirstOrDefault(predicate); - } - return result; + if (result != default) + return result; + + await RefreshAsync(token); + return cached.FirstOrDefault(predicate); } - public Task> WhereAsync(CancellationToken token = default) - => WhereAsync(default, RefreshMode.IfResultEmpty, token); - - public Task> WhereAsync(Func predicate, CancellationToken token = default) - => WhereAsync(predicate, RefreshMode.IfResultEmpty, token); - - public IEnumerable Where(Func predicate = default, RefreshMode refreshMode = RefreshMode.IfResultEmpty) + public IEnumerable Where(Func predicate = default) { - bool isUpdated = CheckRefresh(refreshMode); var result = (predicate != default) ? cached.Where(predicate) : cached; - if (!result.Any() && refreshMode == RefreshMode.IfResultEmpty && !isUpdated) - { - Refresh(); - result = (predicate != default) - ? cached.Where(predicate) - : cached; - } + if (result.Any()) + return result; + + Refresh(); + result = (predicate != default) + ? cached.Where(predicate) + : cached; return result; } public async Task> WhereAsync(Func predicate = default, - RefreshMode refreshMode = RefreshMode.IfResultEmpty, CancellationToken token = default) + CancellationToken token = default) { - bool isUpdated = await CheckRefreshAsync(refreshMode, token); var result = (predicate != default) ? cached.Where(predicate) : cached; - if (!result.Any() && refreshMode == RefreshMode.IfResultEmpty && !isUpdated) - { - await RefreshAsync(token); - result = (predicate != default) - ? cached.Where(predicate) - : cached; - } + if (result.Any()) + return result; + + await RefreshAsync(token); + result = (predicate != default) + ? cached.Where(predicate) + : cached; return result; } - //public IEnumerable Mutate(Func predicate, - // Action mutation) - //{ - // var dbEntities = dbSet.Where(predicate); - // if (dbEntities.Any()) - // { - // foreach (var dbEntity in dbEntities) - // mutation(dbEntity); - // context.SaveChanges(); - // } - // var matchedByPredicate = cached.Select(el => predicate(el)); - // foreach (var item in matchedByPredicate) - // cached.TryTake(out var t); - // cached = cached.RemoveAll(e => predicate(e)); - // foreach (var e in dbEntities) - // cached.Add(e); - // return dbEntities; - //} - - //public async Task> MutateAsync(Func predicate, Action mutation, CancellationToken token = default) - //{ - // var dbEntities = dbSet.Where(predicate); - // if (dbEntities.Any()) - // { - // foreach (var dbEntity in dbEntities) - // mutation(dbEntity); - // await context.SaveChangesAsync(token).ConfigureAwait(false); - // } - // cached.RemoveAll(e => predicate(e)); - // foreach (var e in dbEntities) - // cached.Add(e); - // return dbEntities; - //} - public TEntity Upsert(TEntity entity) { - var updated = dbSet.Update(entity); + Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry updated; + if (dbSet.Contains(entity)) + updated = dbSet.Update(entity); + else + updated = dbSet.Add(entity); context.SaveChanges(); Refresh(); return updated.Entity; @@ -295,7 +246,7 @@ namespace AsbCloudInfrastructure.Services.Cache { var entry = dbSet.Add(entity); context.SaveChanges(); - cached.Add(entry.Entity); + Refresh(); return entry.Entity; } @@ -303,34 +254,28 @@ namespace AsbCloudInfrastructure.Services.Cache { var entry = dbSet.Add(entity); await context.SaveChangesAsync(token).ConfigureAwait(false); - cached.Add(entry.Entity); + await RefreshAsync(token).ConfigureAwait(false); return entry.Entity; } - public IEnumerable Insert(IEnumerable newEntities) + public int Insert(IEnumerable newEntities) { - var dbEntities = new List(newEntities.Count()); - foreach (var item in newEntities) - dbEntities.Add(dbSet.Add(item).Entity); - context.SaveChanges(); - foreach (var e in dbEntities) - cached.Add(e); - return dbEntities; + dbSet.AddRange(newEntities); + var result = context.SaveChanges(); + Refresh(); + return result; } - public async Task> InsertAsync(IEnumerable newEntities, CancellationToken token = default) + public async Task InsertAsync(IEnumerable newEntities, CancellationToken token = default) { - var dbEntities = new List(newEntities.Count()); - foreach (var item in newEntities) - dbEntities.Add(dbSet.Add(item).Entity); - await context.SaveChangesAsync(token).ConfigureAwait(false); - foreach (var e in dbEntities) - cached.Add(e); - return dbEntities; + dbSet.AddRange(newEntities); + var result = await context.SaveChangesAsync(token).ConfigureAwait(false); + await RefreshAsync(token).ConfigureAwait(false); + return result; } public IEnumerator GetEnumerator() => Where().GetEnumerator(); - System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() => GetEnumerator(); + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); } } diff --git a/AsbCloudInfrastructure/Services/Cache/RefreshMode.cs b/AsbCloudInfrastructure/Services/Cache/RefreshMode.cs deleted file mode 100644 index bd60b4ee..00000000 --- a/AsbCloudInfrastructure/Services/Cache/RefreshMode.cs +++ /dev/null @@ -1,4 +0,0 @@ -namespace AsbCloudInfrastructure.Services.Cache -{ - public enum RefreshMode { None, IfResultEmpty, Force, } -} \ No newline at end of file diff --git a/ConsoleApp1/Program.cs b/ConsoleApp1/Program.cs index efc26bc4..aef3eb20 100644 --- a/ConsoleApp1/Program.cs +++ b/ConsoleApp1/Program.cs @@ -9,6 +9,8 @@ using AsbCloudDb.Model; using Microsoft.EntityFrameworkCore; using AsbCloudInfrastructure.Services.Cache; using AsbCloudInfrastructure.Services; +using System.Threading.Tasks; +using System.Threading; namespace ConsoleApp1 { @@ -17,11 +19,99 @@ namespace ConsoleApp1 // .Options; //var context = new AsbCloudDbContext(options); - class Program - { + { + static object lockObject = new(); + static int inc = 0; + static void RefreshMonitor() + { + if (Monitor.TryEnter(lockObject)) + { + Task.Delay(2_000); + Interlocked.Increment(ref inc); + } + else + Monitor.Wait(lockObject); + + } + + //static Mutex mutex = new Mutex(); + //static void RefreshMutex() + //{ + // if(Mutex.TryOpenExisting() + // { + + // } + + // Interlocked.Increment(ref inc); + //} + + static bool isUnLocked = true; + static void RefreshBool() { + if(isUnLocked) + { + isUnLocked = false; + Console.WriteLine("."); + Task.Delay(50).Wait(); + inc++; + isUnLocked = true; + } + while(!isUnLocked) + Task.Delay(10).Wait(); + } + + static readonly SemaphoreSlim semaphore = new(1); + static void Refresh() + { + var wasFree = semaphore.CurrentCount > 0; + semaphore.Wait(); + if (wasFree) + { + Console.WriteLine("."); + Task.Delay(500).Wait(); + inc++; + } + semaphore.Release(); + } + + static async Task RefreshAsync() + { + var wasFree = semaphore.CurrentCount == 1; + await semaphore.WaitAsync(); + if (wasFree) + { + Console.WriteLine("."); + await Task.Delay(500); + inc++; + }else + Console.Write(","); + semaphore.Release(); + } + static void Main(/*string[] args*/) { + + Console.WriteLine(DateTime.Now.ToString("mm:ss.fff")); + //semaphore.Release(); + Refresh(); + for (int i= 0; i < 4; i++) + { + var ts = new List(100); + for (int j = 0; j < 20; j++) + { + ts.Add( + Task.Run( RefreshAsync)); + } + Task.WaitAll(ts.ToArray()); + Console.WriteLine("*"); + } + + Console.WriteLine("_"); + Console.ReadKey(); + Console.WriteLine(inc); + return; + + var options = new DbContextOptionsBuilder() .UseNpgsql("Host=localhost;Database=postgres;Username=postgres;Password=q;Persist Security Info=True") .Options;