From 83c9ac60755316fb2f0b5d7ed6d021cf519b721c Mon Sep 17 00:00:00 2001 From: Roman Efremov Date: Thu, 26 Dec 2024 17:23:50 +0500 Subject: [PATCH 1/2] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20=D0=BF=D0=B0=D1=80=D1=82=D0=B8=D1=86=D0=B8=D0=BE=D0=BD?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ner.cs => 20241226122220_Init.Designer.cs} | 18 +++---- ...0062251_Init.cs => 20241226122220_Init.cs} | 53 ++++++++++--------- ...PersistencePostgresContextModelSnapshot.cs | 16 +++--- DD.Persistence.Database/Entity/ChangeLog.cs | 1 + DD.Persistence.Database/Entity/DataSaub.cs | 2 + .../Entity/DataSourceSystem.cs | 2 + .../Entity/ParameterData.cs | 1 + DD.Persistence.Database/Entity/Setpoint.cs | 1 + DD.Persistence.Database/Entity/TechMessage.cs | 1 + .../Entity/TimestampedSet.cs | 1 + 10 files changed, 54 insertions(+), 42 deletions(-) rename DD.Persistence.Database.Postgres/Migrations/{20241220062251_Init.Designer.cs => 20241226122220_Init.Designer.cs} (96%) rename DD.Persistence.Database.Postgres/Migrations/{20241220062251_Init.cs => 20241226122220_Init.cs} (86%) diff --git a/DD.Persistence.Database.Postgres/Migrations/20241220062251_Init.Designer.cs b/DD.Persistence.Database.Postgres/Migrations/20241226122220_Init.Designer.cs similarity index 96% rename from DD.Persistence.Database.Postgres/Migrations/20241220062251_Init.Designer.cs rename to DD.Persistence.Database.Postgres/Migrations/20241226122220_Init.Designer.cs index 02a25ce..2317c3b 100644 --- a/DD.Persistence.Database.Postgres/Migrations/20241220062251_Init.Designer.cs +++ b/DD.Persistence.Database.Postgres/Migrations/20241226122220_Init.Designer.cs @@ -12,7 +12,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace DD.Persistence.Database.Postgres.Migrations { [DbContext(typeof(PersistencePostgresContext))] - [Migration("20241220062251_Init")] + [Migration("20241226122220_Init")] partial class Init { /// @@ -20,7 +20,7 @@ namespace DD.Persistence.Database.Postgres.Migrations { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "8.0.10") + .HasAnnotation("ProductVersion", "9.0.0") .HasAnnotation("Relational:MaxIdentifierLength", 63); NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); @@ -43,7 +43,7 @@ namespace DD.Persistence.Database.Postgres.Migrations b.HasKey("SystemId"); - b.ToTable("DataSourceSystem"); + b.ToTable("data_source_system"); }); modelBuilder.Entity("DD.Persistence.Database.Entity.ParameterData", b => @@ -67,7 +67,7 @@ namespace DD.Persistence.Database.Postgres.Migrations b.HasKey("DiscriminatorId", "ParameterId", "Timestamp"); - b.ToTable("ParameterData"); + b.ToTable("parameter_data"); }); modelBuilder.Entity("DD.Persistence.Database.Entity.TechMessage", b => @@ -102,7 +102,7 @@ namespace DD.Persistence.Database.Postgres.Migrations b.HasIndex("SystemId"); - b.ToTable("TechMessage"); + b.ToTable("tech_message"); }); modelBuilder.Entity("DD.Persistence.Database.Entity.TimestampedSet", b => @@ -122,7 +122,7 @@ namespace DD.Persistence.Database.Postgres.Migrations b.HasKey("IdDiscriminator", "Timestamp"); - b.ToTable("TimestampedSets", t => + b.ToTable("timestamped_set", t => { t.HasComment("Общая таблица данных временных рядов"); }); @@ -178,7 +178,7 @@ namespace DD.Persistence.Database.Postgres.Migrations b.HasKey("Id"); - b.ToTable("ChangeLog"); + b.ToTable("change_log"); }); modelBuilder.Entity("DD.Persistence.Database.Model.DataSaub", b => @@ -261,7 +261,7 @@ namespace DD.Persistence.Database.Postgres.Migrations b.HasKey("Date"); - b.ToTable("DataSaub"); + b.ToTable("data_saub"); }); modelBuilder.Entity("DD.Persistence.Database.Model.Setpoint", b => @@ -285,7 +285,7 @@ namespace DD.Persistence.Database.Postgres.Migrations b.HasKey("Key", "Created"); - b.ToTable("Setpoint"); + b.ToTable("setpoint"); }); modelBuilder.Entity("DD.Persistence.Database.Entity.TechMessage", b => diff --git a/DD.Persistence.Database.Postgres/Migrations/20241220062251_Init.cs b/DD.Persistence.Database.Postgres/Migrations/20241226122220_Init.cs similarity index 86% rename from DD.Persistence.Database.Postgres/Migrations/20241220062251_Init.cs rename to DD.Persistence.Database.Postgres/Migrations/20241226122220_Init.cs index 03a8c43..d87210e 100644 --- a/DD.Persistence.Database.Postgres/Migrations/20241220062251_Init.cs +++ b/DD.Persistence.Database.Postgres/Migrations/20241226122220_Init.cs @@ -12,7 +12,7 @@ namespace DD.Persistence.Database.Postgres.Migrations protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.CreateTable( - name: "ChangeLog", + name: "change_log", columns: table => new { Id = table.Column(type: "uuid", nullable: false, comment: "Ключ записи"), @@ -29,11 +29,11 @@ namespace DD.Persistence.Database.Postgres.Migrations }, constraints: table => { - table.PrimaryKey("PK_ChangeLog", x => x.Id); + table.PrimaryKey("PK_change_log", x => x.Id); }); migrationBuilder.CreateTable( - name: "DataSaub", + name: "data_saub", columns: table => new { date = table.Column(type: "timestamp with time zone", nullable: false), @@ -58,11 +58,11 @@ namespace DD.Persistence.Database.Postgres.Migrations }, constraints: table => { - table.PrimaryKey("PK_DataSaub", x => x.date); + table.PrimaryKey("PK_data_saub", x => x.date); }); migrationBuilder.CreateTable( - name: "DataSourceSystem", + name: "data_source_system", columns: table => new { SystemId = table.Column(type: "uuid", nullable: false, comment: "Id системы - источника данных"), @@ -71,11 +71,11 @@ namespace DD.Persistence.Database.Postgres.Migrations }, constraints: table => { - table.PrimaryKey("PK_DataSourceSystem", x => x.SystemId); + table.PrimaryKey("PK_data_source_system", x => x.SystemId); }); migrationBuilder.CreateTable( - name: "ParameterData", + name: "parameter_data", columns: table => new { DiscriminatorId = table.Column(type: "uuid", nullable: false, comment: "Дискриминатор системы"), @@ -85,11 +85,11 @@ namespace DD.Persistence.Database.Postgres.Migrations }, constraints: table => { - table.PrimaryKey("PK_ParameterData", x => new { x.DiscriminatorId, x.ParameterId, x.Timestamp }); + table.PrimaryKey("PK_parameter_data", x => new { x.DiscriminatorId, x.ParameterId, x.Timestamp }); }); migrationBuilder.CreateTable( - name: "Setpoint", + name: "setpoint", columns: table => new { Key = table.Column(type: "uuid", nullable: false, comment: "Ключ"), @@ -99,11 +99,11 @@ namespace DD.Persistence.Database.Postgres.Migrations }, constraints: table => { - table.PrimaryKey("PK_Setpoint", x => new { x.Key, x.Created }); + table.PrimaryKey("PK_setpoint", x => new { x.Key, x.Created }); }); migrationBuilder.CreateTable( - name: "TimestampedSets", + name: "timestamped_set", columns: table => new { IdDiscriminator = table.Column(type: "uuid", nullable: false, comment: "Дискриминатор ссылка на тип сохраняемых данных"), @@ -112,12 +112,12 @@ namespace DD.Persistence.Database.Postgres.Migrations }, constraints: table => { - table.PrimaryKey("PK_TimestampedSets", x => new { x.IdDiscriminator, x.Timestamp }); + table.PrimaryKey("PK_timestamped_set", x => new { x.IdDiscriminator, x.Timestamp }); }, comment: "Общая таблица данных временных рядов"); migrationBuilder.CreateTable( - name: "TechMessage", + name: "tech_message", columns: table => new { EventId = table.Column(type: "uuid", nullable: false, comment: "Id события"), @@ -129,44 +129,47 @@ namespace DD.Persistence.Database.Postgres.Migrations }, constraints: table => { - table.PrimaryKey("PK_TechMessage", x => x.EventId); + table.PrimaryKey("PK_tech_message", x => x.EventId); table.ForeignKey( - name: "FK_TechMessage_DataSourceSystem_SystemId", + name: "FK_tech_message_data_source_system_SystemId", column: x => x.SystemId, - principalTable: "DataSourceSystem", + principalTable: "data_source_system", principalColumn: "SystemId", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateIndex( - name: "IX_TechMessage_SystemId", - table: "TechMessage", + name: "IX_tech_message_SystemId", + table: "tech_message", column: "SystemId"); + + migrationBuilder.Sql + ("SELECT create_hypertable('parameter_data','Timestamp','ParameterId',2,chunk_time_interval => INTERVAL '5 day');"); } /// protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.DropTable( - name: "ChangeLog"); + name: "change_log"); migrationBuilder.DropTable( - name: "DataSaub"); + name: "data_saub"); migrationBuilder.DropTable( - name: "ParameterData"); + name: "parameter_data"); migrationBuilder.DropTable( - name: "Setpoint"); + name: "setpoint"); migrationBuilder.DropTable( - name: "TechMessage"); + name: "tech_message"); migrationBuilder.DropTable( - name: "TimestampedSets"); + name: "timestamped_set"); migrationBuilder.DropTable( - name: "DataSourceSystem"); + name: "data_source_system"); } } } diff --git a/DD.Persistence.Database.Postgres/Migrations/PersistencePostgresContextModelSnapshot.cs b/DD.Persistence.Database.Postgres/Migrations/PersistencePostgresContextModelSnapshot.cs index 4c66e90..467f3a6 100644 --- a/DD.Persistence.Database.Postgres/Migrations/PersistencePostgresContextModelSnapshot.cs +++ b/DD.Persistence.Database.Postgres/Migrations/PersistencePostgresContextModelSnapshot.cs @@ -17,7 +17,7 @@ namespace DD.Persistence.Database.Postgres.Migrations { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "8.0.10") + .HasAnnotation("ProductVersion", "9.0.0") .HasAnnotation("Relational:MaxIdentifierLength", 63); NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); @@ -40,7 +40,7 @@ namespace DD.Persistence.Database.Postgres.Migrations b.HasKey("SystemId"); - b.ToTable("DataSourceSystem"); + b.ToTable("data_source_system"); }); modelBuilder.Entity("DD.Persistence.Database.Entity.ParameterData", b => @@ -64,7 +64,7 @@ namespace DD.Persistence.Database.Postgres.Migrations b.HasKey("DiscriminatorId", "ParameterId", "Timestamp"); - b.ToTable("ParameterData"); + b.ToTable("parameter_data"); }); modelBuilder.Entity("DD.Persistence.Database.Entity.TechMessage", b => @@ -99,7 +99,7 @@ namespace DD.Persistence.Database.Postgres.Migrations b.HasIndex("SystemId"); - b.ToTable("TechMessage"); + b.ToTable("tech_message"); }); modelBuilder.Entity("DD.Persistence.Database.Entity.TimestampedSet", b => @@ -119,7 +119,7 @@ namespace DD.Persistence.Database.Postgres.Migrations b.HasKey("IdDiscriminator", "Timestamp"); - b.ToTable("TimestampedSets", t => + b.ToTable("timestamped_set", t => { t.HasComment("Общая таблица данных временных рядов"); }); @@ -175,7 +175,7 @@ namespace DD.Persistence.Database.Postgres.Migrations b.HasKey("Id"); - b.ToTable("ChangeLog"); + b.ToTable("change_log"); }); modelBuilder.Entity("DD.Persistence.Database.Model.DataSaub", b => @@ -258,7 +258,7 @@ namespace DD.Persistence.Database.Postgres.Migrations b.HasKey("Date"); - b.ToTable("DataSaub"); + b.ToTable("data_saub"); }); modelBuilder.Entity("DD.Persistence.Database.Model.Setpoint", b => @@ -282,7 +282,7 @@ namespace DD.Persistence.Database.Postgres.Migrations b.HasKey("Key", "Created"); - b.ToTable("Setpoint"); + b.ToTable("setpoint"); }); modelBuilder.Entity("DD.Persistence.Database.Entity.TechMessage", b => diff --git a/DD.Persistence.Database/Entity/ChangeLog.cs b/DD.Persistence.Database/Entity/ChangeLog.cs index 439e886..a5254ae 100644 --- a/DD.Persistence.Database/Entity/ChangeLog.cs +++ b/DD.Persistence.Database/Entity/ChangeLog.cs @@ -9,6 +9,7 @@ namespace DD.Persistence.Database.Model; /// /// Часть записи, описывающая изменение /// +[Table("change_log")] public class ChangeLog : IChangeLog, IWithSectionPart { [Key, Comment("Ключ записи")] diff --git a/DD.Persistence.Database/Entity/DataSaub.cs b/DD.Persistence.Database/Entity/DataSaub.cs index d4515b2..0442fc4 100644 --- a/DD.Persistence.Database/Entity/DataSaub.cs +++ b/DD.Persistence.Database/Entity/DataSaub.cs @@ -2,6 +2,8 @@ using System.ComponentModel.DataAnnotations.Schema; namespace DD.Persistence.Database.Model; + +[Table("data_saub")] public class DataSaub : ITimestampedData { [Key, Column("date")] diff --git a/DD.Persistence.Database/Entity/DataSourceSystem.cs b/DD.Persistence.Database/Entity/DataSourceSystem.cs index d200731..b11e38e 100644 --- a/DD.Persistence.Database/Entity/DataSourceSystem.cs +++ b/DD.Persistence.Database/Entity/DataSourceSystem.cs @@ -3,6 +3,8 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace DD.Persistence.Database.Entity; + +[Table("data_source_system")] public class DataSourceSystem { [Key, Comment("Id системы - источника данных")] diff --git a/DD.Persistence.Database/Entity/ParameterData.cs b/DD.Persistence.Database/Entity/ParameterData.cs index c81b029..32ac5a4 100644 --- a/DD.Persistence.Database/Entity/ParameterData.cs +++ b/DD.Persistence.Database/Entity/ParameterData.cs @@ -4,6 +4,7 @@ using System.ComponentModel.DataAnnotations.Schema; namespace DD.Persistence.Database.Entity; +[Table("parameter_data")] [PrimaryKey(nameof(DiscriminatorId), nameof(ParameterId), nameof(Timestamp))] public class ParameterData { diff --git a/DD.Persistence.Database/Entity/Setpoint.cs b/DD.Persistence.Database/Entity/Setpoint.cs index 94eca3f..474fb28 100644 --- a/DD.Persistence.Database/Entity/Setpoint.cs +++ b/DD.Persistence.Database/Entity/Setpoint.cs @@ -3,6 +3,7 @@ using System.ComponentModel.DataAnnotations.Schema; namespace DD.Persistence.Database.Model { + [Table("setpoint")] [PrimaryKey(nameof(Key), nameof(Created))] public class Setpoint { diff --git a/DD.Persistence.Database/Entity/TechMessage.cs b/DD.Persistence.Database/Entity/TechMessage.cs index e233941..4c7733b 100644 --- a/DD.Persistence.Database/Entity/TechMessage.cs +++ b/DD.Persistence.Database/Entity/TechMessage.cs @@ -4,6 +4,7 @@ using System.ComponentModel.DataAnnotations.Schema; namespace DD.Persistence.Database.Entity { + [Table("tech_message")] public class TechMessage { [Key, Comment("Id события")] diff --git a/DD.Persistence.Database/Entity/TimestampedSet.cs b/DD.Persistence.Database/Entity/TimestampedSet.cs index f0d1815..10ffd2c 100644 --- a/DD.Persistence.Database/Entity/TimestampedSet.cs +++ b/DD.Persistence.Database/Entity/TimestampedSet.cs @@ -3,6 +3,7 @@ using System.ComponentModel.DataAnnotations.Schema; namespace DD.Persistence.Database.Entity; +[Table("timestamped_set")] [Comment("Общая таблица данных временных рядов")] [PrimaryKey(nameof(IdDiscriminator), nameof(Timestamp))] public record TimestampedSet( From 79818dfa8f2a7cf112b30652a8dc8183c62442c5 Mon Sep 17 00:00:00 2001 From: Roman Efremov Date: Thu, 23 Jan 2025 12:46:34 +0500 Subject: [PATCH 2/2] =?UTF-8?q?=D0=92=D1=8B=D0=BD=D0=B5=D1=81=D1=82=D0=B8?= =?UTF-8?q?=20=D0=BF=D0=B0=D1=80=D1=82=D0=B8=D1=86=D0=B8=D0=BE=D0=BD=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5,=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=B1=D0=B0=D0=B2=D0=B8=D1=82=D1=8C=20=D1=82=D0=B5=D1=81=D1=82?= =?UTF-8?q?=20=D0=BD=D0=B0=D0=B8=D0=BC=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B9=20=D1=81=D1=83=D1=89=D0=BD=D0=BE=D1=81=D1=82=D0=B5?= =?UTF-8?q?=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DD.Persistence.API/Startup.cs | 5 +-- .../EFExtensionsInitialization.cs | 2 +- .../Extensions/EFExtensionsPartitioning.cs | 44 +++++++++++++++++++ .../Migrations/20250122120353_Init.cs | 3 -- DD.Persistence.Database/Entity/ChangeLog.cs | 6 +-- DD.Persistence.Database/Entity/Setpoint.cs | 27 ++++++------ DD.Persistence.Database/Entity/TechMessage.cs | 21 +++++---- .../PersistenceDbContext.cs | 3 +- .../Controllers/ChangeLogControllerTest.cs | 18 ++++---- .../Controllers/SetpointControllerTest.cs | 2 +- .../WebAppFactoryFixture.cs | 2 +- .../DependencyInjection.cs | 9 ++-- .../Repositories/ChangeLogRepository.cs | 8 ++-- .../Repositories/SetpointRepository.cs | 8 ++-- .../DD.Persistence.Test.csproj | 1 + DD.Persistence.Test/TableAttributeShould.cs | 34 ++++++++++++++ 16 files changed, 131 insertions(+), 62 deletions(-) rename DD.Persistence.Database.Postgres/{ => Extensions}/EFExtensionsInitialization.cs (97%) create mode 100644 DD.Persistence.Database.Postgres/Extensions/EFExtensionsPartitioning.cs create mode 100644 DD.Persistence.Test/TableAttributeShould.cs diff --git a/DD.Persistence.API/Startup.cs b/DD.Persistence.API/Startup.cs index c5e8c5a..1a880c0 100644 --- a/DD.Persistence.API/Startup.cs +++ b/DD.Persistence.API/Startup.cs @@ -1,5 +1,5 @@ using DD.Persistence.Database.Model; -using DD.Persistence.Database.Postgres; +using DD.Persistence.Database.Postgres.Extensions; using DD.Persistence.Repository; namespace DD.Persistence.API; @@ -59,7 +59,6 @@ public class Startup var context = provider.GetRequiredService(); context.Database.EnsureCreatedAndMigrated(); + context.Database.AddPartitioning(); } - - } diff --git a/DD.Persistence.Database.Postgres/EFExtensionsInitialization.cs b/DD.Persistence.Database.Postgres/Extensions/EFExtensionsInitialization.cs similarity index 97% rename from DD.Persistence.Database.Postgres/EFExtensionsInitialization.cs rename to DD.Persistence.Database.Postgres/Extensions/EFExtensionsInitialization.cs index fe24f37..e5c9c90 100644 --- a/DD.Persistence.Database.Postgres/EFExtensionsInitialization.cs +++ b/DD.Persistence.Database.Postgres/Extensions/EFExtensionsInitialization.cs @@ -2,7 +2,7 @@ using Microsoft.EntityFrameworkCore.Infrastructure; using System.Diagnostics; -namespace DD.Persistence.Database.Postgres; +namespace DD.Persistence.Database.Postgres.Extensions; public static class EFExtensionsInitialization { public static void EnsureCreatedAndMigrated(this DatabaseFacade db) diff --git a/DD.Persistence.Database.Postgres/Extensions/EFExtensionsPartitioning.cs b/DD.Persistence.Database.Postgres/Extensions/EFExtensionsPartitioning.cs new file mode 100644 index 0000000..7a4c199 --- /dev/null +++ b/DD.Persistence.Database.Postgres/Extensions/EFExtensionsPartitioning.cs @@ -0,0 +1,44 @@ +using DD.Persistence.Database.Entity; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using System.ComponentModel.DataAnnotations.Schema; +using System.Reflection; + +namespace DD.Persistence.Database.Postgres.Extensions; +public static class EFExtensionsPartitioning +{ + public static void AddPartitioning(this DatabaseFacade db) + { + db.CreateTimescaledbExtension(); + db.AddParameterDataPartitioning(); + } + + private static void CreateTimescaledbExtension(this DatabaseFacade db) + { + var sqlString = $"CREATE EXTENSION IF NOT EXISTS timescaledb;"; + db.ExecuteSqlRaw(sqlString); + } + + /// + /// Добавить партиционирование таблицы ParameterData (Wits - данные) + /// + /// + private static void AddParameterDataPartitioning(this DatabaseFacade db) + { + var type = typeof(ParameterData); + var tableAttribute = type.GetCustomAttribute(); + if (tableAttribute is null) + { + return; + } + + const int sectionsNumber = 2; + const int chunkTimeInterval = 5; + var sqlString = $"SELECT create_hypertable({tableAttribute.Name}," + + $"'{nameof(ParameterData.Timestamp)}'," + + $"'{nameof(ParameterData.ParameterId)}'," + + $"{sectionsNumber}," + + $"chunk_time_interval => INTERVAL '{chunkTimeInterval} day');"; + db.ExecuteSqlRaw(sqlString); + } +} diff --git a/DD.Persistence.Database.Postgres/Migrations/20250122120353_Init.cs b/DD.Persistence.Database.Postgres/Migrations/20250122120353_Init.cs index bc48d98..6f56873 100644 --- a/DD.Persistence.Database.Postgres/Migrations/20250122120353_Init.cs +++ b/DD.Persistence.Database.Postgres/Migrations/20250122120353_Init.cs @@ -131,9 +131,6 @@ namespace DD.Persistence.Database.Postgres.Migrations name: "IX_tech_message_SystemId", table: "tech_message", column: "SystemId"); - - migrationBuilder.Sql - ("SELECT create_hypertable('parameter_data','Timestamp','ParameterId',2,chunk_time_interval => INTERVAL '5 day');"); } /// diff --git a/DD.Persistence.Database/Entity/ChangeLog.cs b/DD.Persistence.Database/Entity/ChangeLog.cs index 1fb37d8..9051bbc 100644 --- a/DD.Persistence.Database/Entity/ChangeLog.cs +++ b/DD.Persistence.Database/Entity/ChangeLog.cs @@ -1,11 +1,11 @@  +using DD.Persistence.Database.EntityAbstractions; +using DD.Persistence.ModelsAbstractions; using Microsoft.EntityFrameworkCore; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; -using DD.Persistence.ModelsAbstractions; -using DD.Persistence.Database.EntityAbstractions; -namespace DD.Persistence.Database.Model; +namespace DD.Persistence.Database.Entity; /// /// Часть записи, описывающая изменение diff --git a/DD.Persistence.Database/Entity/Setpoint.cs b/DD.Persistence.Database/Entity/Setpoint.cs index 1175dc5..64c816c 100644 --- a/DD.Persistence.Database/Entity/Setpoint.cs +++ b/DD.Persistence.Database/Entity/Setpoint.cs @@ -3,22 +3,21 @@ using Microsoft.EntityFrameworkCore; using System.ComponentModel.DataAnnotations.Schema; using System.Text.Json; -namespace DD.Persistence.Database.Model +namespace DD.Persistence.Database.Entity; + +[Table("setpoint")] +[PrimaryKey(nameof(Key), nameof(Timestamp))] +public class Setpoint : ITimestampedItem { - [Table("setpoint")] - [PrimaryKey(nameof(Key), nameof(Timestamp))] - public class Setpoint : ITimestampedItem - { - [Comment("Ключ")] - public Guid Key { get; set; } + [Comment("Ключ")] + public Guid Key { get; set; } - [Column(TypeName = "jsonb"), Comment("Значение уставки")] - public required JsonElement Value { get; set; } + [Column(TypeName = "jsonb"), Comment("Значение уставки")] + public required JsonElement Value { get; set; } - [Comment("Дата создания уставки")] - public DateTimeOffset Timestamp { get; set; } + [Comment("Дата создания уставки")] + public DateTimeOffset Timestamp { get; set; } - [Comment("Id автора последнего изменения")] - public Guid IdUser { get; set; } - } + [Comment("Id автора последнего изменения")] + public Guid IdUser { get; set; } } diff --git a/DD.Persistence.Database/Entity/TechMessage.cs b/DD.Persistence.Database/Entity/TechMessage.cs index c57cd3b..093784f 100644 --- a/DD.Persistence.Database/Entity/TechMessage.cs +++ b/DD.Persistence.Database/Entity/TechMessage.cs @@ -3,19 +3,19 @@ using Microsoft.EntityFrameworkCore; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; -namespace DD.Persistence.Database.Entity +namespace DD.Persistence.Database.Entity; + +[Table("tech_message")] +public class TechMessage : ITimestampedItem { - [Table("tech_message")] - public class TechMessage : ITimestampedItem - { - [Key, Comment("Id события")] - public Guid EventId { get; set; } + [Key, Comment("Id события")] + public Guid EventId { get; set; } - [Comment("Id Категории важности")] - public int CategoryId { get; set; } + [Comment("Id Категории важности")] + public int CategoryId { get; set; } - [Comment("Дата возникновения")] - public DateTimeOffset Timestamp { get; set; } + [Comment("Дата возникновения")] + public DateTimeOffset Timestamp { get; set; } [Column(TypeName = "varchar(512)"), Comment("Текст сообщения")] public required string Text { get; set; } @@ -29,4 +29,3 @@ namespace DD.Persistence.Database.Entity [Comment("Статус события")] public int EventState { get; set; } } -} diff --git a/DD.Persistence.Database/PersistenceDbContext.cs b/DD.Persistence.Database/PersistenceDbContext.cs index 5a9a13c..fbbc057 100644 --- a/DD.Persistence.Database/PersistenceDbContext.cs +++ b/DD.Persistence.Database/PersistenceDbContext.cs @@ -1,6 +1,5 @@ -using Microsoft.EntityFrameworkCore; using DD.Persistence.Database.Entity; -using DD.Persistence.Database.Model; +using Microsoft.EntityFrameworkCore; namespace DD.Persistence.Database; diff --git a/DD.Persistence.IntegrationTests/Controllers/ChangeLogControllerTest.cs b/DD.Persistence.IntegrationTests/Controllers/ChangeLogControllerTest.cs index 64419e7..f7a9a4d 100644 --- a/DD.Persistence.IntegrationTests/Controllers/ChangeLogControllerTest.cs +++ b/DD.Persistence.IntegrationTests/Controllers/ChangeLogControllerTest.cs @@ -1,17 +1,15 @@ +using DD.Persistence.Client; +using DD.Persistence.Client.Clients; +using DD.Persistence.Client.Clients.Interfaces; +using DD.Persistence.Client.Clients.Interfaces.Refit; +using DD.Persistence.Database.Entity; +using DD.Persistence.Models; +using DD.Persistence.Models.Requests; using Mapster; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; -using DD.Persistence.Database.Model; -using DD.Persistence.Models; -using DD.Persistence.Models.Requests; -using Xunit; -using DD.Persistence.Client.Clients.Interfaces; -using DD.Persistence.Client; -using DD.Persistence.Client.Clients.Interfaces.Refit; -using DD.Persistence.Client.Clients; using Microsoft.Extensions.Logging; -using Refit; -using System.Net.Http; +using Xunit; namespace DD.Persistence.IntegrationTests.Controllers; public class ChangeLogControllerTest : BaseIntegrationTest diff --git a/DD.Persistence.IntegrationTests/Controllers/SetpointControllerTest.cs b/DD.Persistence.IntegrationTests/Controllers/SetpointControllerTest.cs index e84402a..64506dc 100644 --- a/DD.Persistence.IntegrationTests/Controllers/SetpointControllerTest.cs +++ b/DD.Persistence.IntegrationTests/Controllers/SetpointControllerTest.cs @@ -2,7 +2,7 @@ using DD.Persistence.Client; using DD.Persistence.Client.Clients; using DD.Persistence.Client.Clients.Interfaces; using DD.Persistence.Client.Clients.Interfaces.Refit; -using DD.Persistence.Database.Model; +using DD.Persistence.Database.Entity; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using System.Text.Json; diff --git a/DD.Persistence.IntegrationTests/WebAppFactoryFixture.cs b/DD.Persistence.IntegrationTests/WebAppFactoryFixture.cs index 0d680b3..31b4da4 100644 --- a/DD.Persistence.IntegrationTests/WebAppFactoryFixture.cs +++ b/DD.Persistence.IntegrationTests/WebAppFactoryFixture.cs @@ -8,12 +8,12 @@ using Microsoft.Extensions.Logging; using DD.Persistence.API; using DD.Persistence.Client; using DD.Persistence.Database.Model; -using DD.Persistence.Database.Postgres; using RestSharp; using DD.Persistence.App; using DD.Persistence.Client.Helpers; using DD.Persistence.Factories; using System.Net; +using DD.Persistence.Database.Postgres.Extensions; namespace DD.Persistence.IntegrationTests; public class WebAppFactoryFixture : WebApplicationFactory diff --git a/DD.Persistence.Repository/DependencyInjection.cs b/DD.Persistence.Repository/DependencyInjection.cs index d0a5d37..33cd25b 100644 --- a/DD.Persistence.Repository/DependencyInjection.cs +++ b/DD.Persistence.Repository/DependencyInjection.cs @@ -1,12 +1,11 @@ -using Mapster; -using Microsoft.Extensions.DependencyInjection; -using DD.Persistence.Database.Model; +using DD.Persistence.Database.Entity; using DD.Persistence.Models; using DD.Persistence.Repositories; using DD.Persistence.Repository.Repositories; -using DD.Persistence.Database.Entity; -using System.Reflection; using DD.Persistence.Repository.RepositoriesCached; +using Mapster; +using Microsoft.Extensions.DependencyInjection; +using System.Reflection; namespace DD.Persistence.Repository; public static class DependencyInjection diff --git a/DD.Persistence.Repository/Repositories/ChangeLogRepository.cs b/DD.Persistence.Repository/Repositories/ChangeLogRepository.cs index 60fe08e..466d481 100644 --- a/DD.Persistence.Repository/Repositories/ChangeLogRepository.cs +++ b/DD.Persistence.Repository/Repositories/ChangeLogRepository.cs @@ -1,11 +1,11 @@ -using Mapster; -using Microsoft.EntityFrameworkCore; -using DD.Persistence.Database.Model; +using DD.Persistence.Database.Entity; using DD.Persistence.Models; +using DD.Persistence.Models.Common; using DD.Persistence.Models.Requests; using DD.Persistence.Repositories; +using Mapster; +using Microsoft.EntityFrameworkCore; using UuidExtensions; -using DD.Persistence.Models.Common; namespace DD.Persistence.Repository.Repositories; public class ChangeLogRepository : IChangeLogRepository diff --git a/DD.Persistence.Repository/Repositories/SetpointRepository.cs b/DD.Persistence.Repository/Repositories/SetpointRepository.cs index 8c3ae65..97c6098 100644 --- a/DD.Persistence.Repository/Repositories/SetpointRepository.cs +++ b/DD.Persistence.Repository/Repositories/SetpointRepository.cs @@ -1,10 +1,10 @@ +using DD.Persistence.Database.Entity; +using DD.Persistence.Models; +using DD.Persistence.Models.Common; +using DD.Persistence.Repositories; using Mapster; using Microsoft.EntityFrameworkCore; -using DD.Persistence.Database.Model; -using DD.Persistence.Models; -using DD.Persistence.Repositories; using System.Text.Json; -using DD.Persistence.Models.Common; namespace DD.Persistence.Repository.Repositories { diff --git a/DD.Persistence.Test/DD.Persistence.Test.csproj b/DD.Persistence.Test/DD.Persistence.Test.csproj index 8efaa34..bd3079d 100644 --- a/DD.Persistence.Test/DD.Persistence.Test.csproj +++ b/DD.Persistence.Test/DD.Persistence.Test.csproj @@ -16,6 +16,7 @@ + diff --git a/DD.Persistence.Test/TableAttributeShould.cs b/DD.Persistence.Test/TableAttributeShould.cs new file mode 100644 index 0000000..7a08f4b --- /dev/null +++ b/DD.Persistence.Test/TableAttributeShould.cs @@ -0,0 +1,34 @@ +using System.ComponentModel.DataAnnotations.Schema; +using System.Globalization; +using System.Reflection; +using System.Text.RegularExpressions; + +namespace DD.Persistence.Test; +public class TableAttributeShould +{ + private const string Separator = "_"; + private const string TargetAssembly = "DD.Persistence.Database"; + private const string TargetNamespace = "DD.Persistence.Database.Entity"; + + [Fact] + public void Test() + { + Assembly assembly = Assembly.Load(TargetAssembly); + var typesInNamespace = assembly.GetTypes() + .Where(t => t.IsClass && t.Namespace == TargetNamespace) + .ToList(); + + foreach (var type in typesInNamespace) + { + var tableAttribute = type.GetCustomAttribute(); + Assert.NotNull(tableAttribute); + + var partsOfClassName = Regex + .Split(type.Name, @"(?=[A-Z])") + .Where(s => s != string.Empty) + .Select(s => s.ToLower(CultureInfo.InvariantCulture)); + var expectedClassName = string.Join(Separator, partsOfClassName); + Assert.Equal(expectedClassName, tableAttribute.Name); + } + } +}