diff --git a/GSS2.Core/Analysis/AmineContent/Database/Calibration/20260227055810_AmineContentCalibrationInitial.Designer.cs b/GSS2.Core/Analysis/AmineContent/Database/Calibration/20260227093032_AmineContentCalibrationInitial.Designer.cs similarity index 83% rename from GSS2.Core/Analysis/AmineContent/Database/Calibration/20260227055810_AmineContentCalibrationInitial.Designer.cs rename to GSS2.Core/Analysis/AmineContent/Database/Calibration/20260227093032_AmineContentCalibrationInitial.Designer.cs index 5bf9793..73926da 100644 --- a/GSS2.Core/Analysis/AmineContent/Database/Calibration/20260227055810_AmineContentCalibrationInitial.Designer.cs +++ b/GSS2.Core/Analysis/AmineContent/Database/Calibration/20260227093032_AmineContentCalibrationInitial.Designer.cs @@ -11,7 +11,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace GSS2.Core.Analysis.AmineContent.Database.Calibration { [DbContext(typeof(AmineContentCalibrationContext))] - [Migration("20260227055810_AmineContentCalibrationInitial")] + [Migration("20260227093032_AmineContentCalibrationInitial")] partial class AmineContentCalibrationInitial { /// @@ -20,6 +20,21 @@ namespace GSS2.Core.Analysis.AmineContent.Database.Calibration #pragma warning disable 612, 618 modelBuilder.HasAnnotation("ProductVersion", "10.0.0"); + modelBuilder.Entity("CalibrationSeparatorImage", b => + { + b.Property("CalibrationRecordId") + .HasColumnType("INTEGER"); + + b.Property("ImageRecordId") + .HasColumnType("INTEGER"); + + b.HasKey("CalibrationRecordId", "ImageRecordId"); + + b.HasIndex("ImageRecordId"); + + b.ToTable("CalibrationSeparatorImages", (string)null); + }); + modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.Calibration.CalibrationRecord", b => { b.Property("Id") @@ -84,10 +99,7 @@ namespace GSS2.Core.Analysis.AmineContent.Database.Calibration .HasColumnType("INTEGER") .HasComment("Уникальный идентификатор"); - b.Property("CalibrationRecordId") - .HasColumnType("INTEGER"); - - b.Property("CalibrationRecordId1") + b.Property("CalibrationSampleId") .HasColumnType("INTEGER"); b.Property("ImagePath") @@ -99,9 +111,6 @@ namespace GSS2.Core.Analysis.AmineContent.Database.Calibration b.Property("SeparatorRecordId") .HasColumnType("INTEGER"); - b.Property("TrayRecordId") - .HasColumnType("INTEGER"); - b.Property("Uv254Intensity") .HasColumnType("REAL") .HasComment("Интенсивность УФ излучения 254 нм (0..1)"); @@ -116,14 +125,10 @@ namespace GSS2.Core.Analysis.AmineContent.Database.Calibration b.HasKey("Id"); - b.HasIndex("CalibrationRecordId"); - - b.HasIndex("CalibrationRecordId1"); + b.HasIndex("CalibrationSampleId"); b.HasIndex("SeparatorRecordId"); - b.HasIndex("TrayRecordId"); - b.ToTable("ImageRecords"); }); @@ -151,57 +156,47 @@ namespace GSS2.Core.Analysis.AmineContent.Database.Calibration b.ToTable("SeparatorRecords"); }); - modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.Calibration.TrayRecord", b => + modelBuilder.Entity("CalibrationSeparatorImage", b => { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasComment("Уникальный идентификатор"); + b.HasOne("GSS2.Core.Analysis.AmineContent.Database.Calibration.CalibrationRecord", null) + .WithMany() + .HasForeignKey("CalibrationRecordId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.HasKey("Id"); - - b.ToTable("TrayRecords"); + b.HasOne("GSS2.Core.Analysis.AmineContent.Database.Calibration.ImageRecord", null) + .WithMany() + .HasForeignKey("ImageRecordId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); }); modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.Calibration.ImageRecord", b => { - b.HasOne("GSS2.Core.Analysis.AmineContent.Database.Calibration.CalibrationRecord", null) + b.HasOne("GSS2.Core.Analysis.AmineContent.Database.Calibration.CalibrationRecord", "CalibrationSample") .WithMany("SampleImages") - .HasForeignKey("CalibrationRecordId") + .HasForeignKey("CalibrationSampleId") .OnDelete(DeleteBehavior.Cascade); - b.HasOne("GSS2.Core.Analysis.AmineContent.Database.Calibration.CalibrationRecord", null) - .WithMany("SeparatorImages") - .HasForeignKey("CalibrationRecordId1") - .OnDelete(DeleteBehavior.Cascade); - - b.HasOne("GSS2.Core.Analysis.AmineContent.Database.Calibration.SeparatorRecord", null) + b.HasOne("GSS2.Core.Analysis.AmineContent.Database.Calibration.SeparatorRecord", "Separator") .WithMany("Images") .HasForeignKey("SeparatorRecordId") .OnDelete(DeleteBehavior.Cascade); - b.HasOne("GSS2.Core.Analysis.AmineContent.Database.Calibration.TrayRecord", null) - .WithMany("Images") - .HasForeignKey("TrayRecordId") - .OnDelete(DeleteBehavior.Cascade); + b.Navigation("CalibrationSample"); + + b.Navigation("Separator"); }); modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.Calibration.CalibrationRecord", b => { b.Navigation("SampleImages"); - - b.Navigation("SeparatorImages"); }); modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.Calibration.SeparatorRecord", b => { b.Navigation("Images"); }); - - modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.Calibration.TrayRecord", b => - { - b.Navigation("Images"); - }); #pragma warning restore 612, 618 } } diff --git a/GSS2.Core/Analysis/AmineContent/Database/Calibration/20260227055810_AmineContentCalibrationInitial.cs b/GSS2.Core/Analysis/AmineContent/Database/Calibration/20260227093032_AmineContentCalibrationInitial.cs similarity index 83% rename from GSS2.Core/Analysis/AmineContent/Database/Calibration/20260227055810_AmineContentCalibrationInitial.cs rename to GSS2.Core/Analysis/AmineContent/Database/Calibration/20260227093032_AmineContentCalibrationInitial.cs index 1baa25e..307e755 100644 --- a/GSS2.Core/Analysis/AmineContent/Database/Calibration/20260227055810_AmineContentCalibrationInitial.cs +++ b/GSS2.Core/Analysis/AmineContent/Database/Calibration/20260227093032_AmineContentCalibrationInitial.cs @@ -47,18 +47,6 @@ namespace GSS2.Core.Analysis.AmineContent.Database.Calibration table.PrimaryKey("PK_SeparatorRecords", x => x.Id); }); - migrationBuilder.CreateTable( - name: "TrayRecords", - columns: table => new - { - Id = table.Column(type: "INTEGER", nullable: false, comment: "Уникальный идентификатор") - .Annotation("Sqlite:Autoincrement", true) - }, - constraints: table => - { - table.PrimaryKey("PK_TrayRecords", x => x.Id); - }); - migrationBuilder.CreateTable( name: "ImageRecords", columns: table => new @@ -69,23 +57,15 @@ namespace GSS2.Core.Analysis.AmineContent.Database.Calibration Uv365Intensity = table.Column(type: "REAL", nullable: false, comment: "Интенсивность УФ излучения 365 нм (0..1)"), Uv254Intensity = table.Column(type: "REAL", nullable: false, comment: "Интенсивность УФ излучения 254 нм (0..1)"), ImagePath = table.Column(type: "TEXT", maxLength: 1024, nullable: false, comment: "Путь к файлу изображения"), - CalibrationRecordId = table.Column(type: "INTEGER", nullable: true), - CalibrationRecordId1 = table.Column(type: "INTEGER", nullable: true), SeparatorRecordId = table.Column(type: "INTEGER", nullable: true), - TrayRecordId = table.Column(type: "INTEGER", nullable: true) + CalibrationSampleId = table.Column(type: "INTEGER", nullable: true) }, constraints: table => { table.PrimaryKey("PK_ImageRecords", x => x.Id); table.ForeignKey( - name: "FK_ImageRecords_CalibrationRecords_CalibrationRecordId", - column: x => x.CalibrationRecordId, - principalTable: "CalibrationRecords", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_ImageRecords_CalibrationRecords_CalibrationRecordId1", - column: x => x.CalibrationRecordId1, + name: "FK_ImageRecords_CalibrationRecords_CalibrationSampleId", + column: x => x.CalibrationSampleId, principalTable: "CalibrationRecords", principalColumn: "Id", onDelete: ReferentialAction.Cascade); @@ -95,38 +75,54 @@ namespace GSS2.Core.Analysis.AmineContent.Database.Calibration principalTable: "SeparatorRecords", principalColumn: "Id", onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "CalibrationSeparatorImages", + columns: table => new + { + CalibrationRecordId = table.Column(type: "INTEGER", nullable: false), + ImageRecordId = table.Column(type: "INTEGER", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_CalibrationSeparatorImages", x => new { x.CalibrationRecordId, x.ImageRecordId }); table.ForeignKey( - name: "FK_ImageRecords_TrayRecords_TrayRecordId", - column: x => x.TrayRecordId, - principalTable: "TrayRecords", + name: "FK_CalibrationSeparatorImages_CalibrationRecords_CalibrationRecordId", + column: x => x.CalibrationRecordId, + principalTable: "CalibrationRecords", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_CalibrationSeparatorImages_ImageRecords_ImageRecordId", + column: x => x.ImageRecordId, + principalTable: "ImageRecords", principalColumn: "Id", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateIndex( - name: "IX_ImageRecords_CalibrationRecordId", - table: "ImageRecords", - column: "CalibrationRecordId"); + name: "IX_CalibrationSeparatorImages_ImageRecordId", + table: "CalibrationSeparatorImages", + column: "ImageRecordId"); migrationBuilder.CreateIndex( - name: "IX_ImageRecords_CalibrationRecordId1", + name: "IX_ImageRecords_CalibrationSampleId", table: "ImageRecords", - column: "CalibrationRecordId1"); + column: "CalibrationSampleId"); migrationBuilder.CreateIndex( name: "IX_ImageRecords_SeparatorRecordId", table: "ImageRecords", column: "SeparatorRecordId"); - - migrationBuilder.CreateIndex( - name: "IX_ImageRecords_TrayRecordId", - table: "ImageRecords", - column: "TrayRecordId"); } /// protected override void Down(MigrationBuilder migrationBuilder) { + migrationBuilder.DropTable( + name: "CalibrationSeparatorImages"); + migrationBuilder.DropTable( name: "ImageRecords"); @@ -135,9 +131,6 @@ namespace GSS2.Core.Analysis.AmineContent.Database.Calibration migrationBuilder.DropTable( name: "SeparatorRecords"); - - migrationBuilder.DropTable( - name: "TrayRecords"); } } } diff --git a/GSS2.Core/Analysis/AmineContent/Database/Calibration/AmineContentCalibrationContext.cs b/GSS2.Core/Analysis/AmineContent/Database/Calibration/AmineContentCalibrationContext.cs index 403fcca..f7a1b5d 100644 --- a/GSS2.Core/Analysis/AmineContent/Database/Calibration/AmineContentCalibrationContext.cs +++ b/GSS2.Core/Analysis/AmineContent/Database/Calibration/AmineContentCalibrationContext.cs @@ -4,9 +4,7 @@ namespace GSS2.Core.Analysis.AmineContent.Database.Calibration; public class AmineContentCalibrationContext : DbContext { - public DbSet ImageRecords => Set(); - public DbSet TrayRecords => Set(); public DbSet SeparatorRecords => Set(); public DbSet CalibrationRecords => Set(); @@ -21,55 +19,62 @@ public class AmineContentCalibrationContext : DbContext modelBuilder.Entity(entity => { entity.HasKey(x => x.Id); - entity.Property(x => x.ImagePath) .IsRequired() .HasMaxLength(1024); }); - modelBuilder.Entity(entity => - { - entity.HasKey(x => x.Id); - - entity.HasMany(x => x.Images) - .WithOne() - .OnDelete(DeleteBehavior.Cascade); - }); - modelBuilder.Entity(entity => { entity.HasKey(x => x.Id); - + entity.HasMany(x => x.Images) + .WithOne(x => x.Separator) + .HasForeignKey(x => x.SeparatorRecordId) + .OnDelete(DeleteBehavior.Cascade); entity.Property(x => x.Type) .IsRequired() .HasMaxLength(256); - entity.Property(x => x.Batch) .IsRequired() .HasMaxLength(256); - - entity.HasMany(x => x.Images) - .WithOne() - .OnDelete(DeleteBehavior.Cascade); }); modelBuilder.Entity(entity => { entity.HasKey(x => x.Id); - - entity.Property(x => x.SampleName).HasMaxLength(512); - entity.Property(x => x.SampleComment).HasMaxLength(2048); - entity.Property(x => x.SampleBrand).HasMaxLength(512); - entity.Property(x => x.SamplingPlace).HasMaxLength(512); - entity.Property(x => x.MixtureName).HasMaxLength(512); - entity.HasMany(x => x.SampleImages) - .WithOne() + .WithOne(x => x.CalibrationSample) + .HasForeignKey(x => x.CalibrationSampleId) .OnDelete(DeleteBehavior.Cascade); - entity.HasMany(x => x.SeparatorImages) - .WithOne() - .OnDelete(DeleteBehavior.Cascade); + .WithMany(x => x.UsedInCalibrations) + .UsingEntity>( + "CalibrationSeparatorImage", + j => j + .HasOne() + .WithMany() + .HasForeignKey("ImageRecordId") + .OnDelete(DeleteBehavior.Cascade), + j => j + .HasOne() + .WithMany() + .HasForeignKey("CalibrationRecordId") + .OnDelete(DeleteBehavior.Cascade), + j => + { + j.HasKey("CalibrationRecordId", "ImageRecordId"); + j.ToTable("CalibrationSeparatorImages"); + }); + entity.Property(x => x.SampleName) + .HasMaxLength(512); + entity.Property(x => x.SampleComment) + .HasMaxLength(2048); + entity.Property(x => x.SampleBrand) + .HasMaxLength(512); + entity.Property(x => x.SamplingPlace) + .HasMaxLength(512); + entity.Property(x => x.MixtureName) + .HasMaxLength(512); }); } } \ No newline at end of file diff --git a/GSS2.Core/Analysis/AmineContent/Database/Calibration/AmineContentCalibrationContextModelSnapshot.cs b/GSS2.Core/Analysis/AmineContent/Database/Calibration/AmineContentCalibrationContextModelSnapshot.cs index 7173855..c52acf3 100644 --- a/GSS2.Core/Analysis/AmineContent/Database/Calibration/AmineContentCalibrationContextModelSnapshot.cs +++ b/GSS2.Core/Analysis/AmineContent/Database/Calibration/AmineContentCalibrationContextModelSnapshot.cs @@ -17,6 +17,21 @@ namespace GSS2.Core.Analysis.AmineContent.Database.Calibration #pragma warning disable 612, 618 modelBuilder.HasAnnotation("ProductVersion", "10.0.0"); + modelBuilder.Entity("CalibrationSeparatorImage", b => + { + b.Property("CalibrationRecordId") + .HasColumnType("INTEGER"); + + b.Property("ImageRecordId") + .HasColumnType("INTEGER"); + + b.HasKey("CalibrationRecordId", "ImageRecordId"); + + b.HasIndex("ImageRecordId"); + + b.ToTable("CalibrationSeparatorImages", (string)null); + }); + modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.Calibration.CalibrationRecord", b => { b.Property("Id") @@ -81,10 +96,7 @@ namespace GSS2.Core.Analysis.AmineContent.Database.Calibration .HasColumnType("INTEGER") .HasComment("Уникальный идентификатор"); - b.Property("CalibrationRecordId") - .HasColumnType("INTEGER"); - - b.Property("CalibrationRecordId1") + b.Property("CalibrationSampleId") .HasColumnType("INTEGER"); b.Property("ImagePath") @@ -96,9 +108,6 @@ namespace GSS2.Core.Analysis.AmineContent.Database.Calibration b.Property("SeparatorRecordId") .HasColumnType("INTEGER"); - b.Property("TrayRecordId") - .HasColumnType("INTEGER"); - b.Property("Uv254Intensity") .HasColumnType("REAL") .HasComment("Интенсивность УФ излучения 254 нм (0..1)"); @@ -113,14 +122,10 @@ namespace GSS2.Core.Analysis.AmineContent.Database.Calibration b.HasKey("Id"); - b.HasIndex("CalibrationRecordId"); - - b.HasIndex("CalibrationRecordId1"); + b.HasIndex("CalibrationSampleId"); b.HasIndex("SeparatorRecordId"); - b.HasIndex("TrayRecordId"); - b.ToTable("ImageRecords"); }); @@ -148,57 +153,47 @@ namespace GSS2.Core.Analysis.AmineContent.Database.Calibration b.ToTable("SeparatorRecords"); }); - modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.Calibration.TrayRecord", b => + modelBuilder.Entity("CalibrationSeparatorImage", b => { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasComment("Уникальный идентификатор"); + b.HasOne("GSS2.Core.Analysis.AmineContent.Database.Calibration.CalibrationRecord", null) + .WithMany() + .HasForeignKey("CalibrationRecordId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.HasKey("Id"); - - b.ToTable("TrayRecords"); + b.HasOne("GSS2.Core.Analysis.AmineContent.Database.Calibration.ImageRecord", null) + .WithMany() + .HasForeignKey("ImageRecordId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); }); modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.Calibration.ImageRecord", b => { - b.HasOne("GSS2.Core.Analysis.AmineContent.Database.Calibration.CalibrationRecord", null) + b.HasOne("GSS2.Core.Analysis.AmineContent.Database.Calibration.CalibrationRecord", "CalibrationSample") .WithMany("SampleImages") - .HasForeignKey("CalibrationRecordId") + .HasForeignKey("CalibrationSampleId") .OnDelete(DeleteBehavior.Cascade); - b.HasOne("GSS2.Core.Analysis.AmineContent.Database.Calibration.CalibrationRecord", null) - .WithMany("SeparatorImages") - .HasForeignKey("CalibrationRecordId1") - .OnDelete(DeleteBehavior.Cascade); - - b.HasOne("GSS2.Core.Analysis.AmineContent.Database.Calibration.SeparatorRecord", null) + b.HasOne("GSS2.Core.Analysis.AmineContent.Database.Calibration.SeparatorRecord", "Separator") .WithMany("Images") .HasForeignKey("SeparatorRecordId") .OnDelete(DeleteBehavior.Cascade); - b.HasOne("GSS2.Core.Analysis.AmineContent.Database.Calibration.TrayRecord", null) - .WithMany("Images") - .HasForeignKey("TrayRecordId") - .OnDelete(DeleteBehavior.Cascade); + b.Navigation("CalibrationSample"); + + b.Navigation("Separator"); }); modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.Calibration.CalibrationRecord", b => { b.Navigation("SampleImages"); - - b.Navigation("SeparatorImages"); }); modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.Calibration.SeparatorRecord", b => { b.Navigation("Images"); }); - - modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.Calibration.TrayRecord", b => - { - b.Navigation("Images"); - }); #pragma warning restore 612, 618 } } diff --git a/GSS2.Core/Analysis/AmineContent/Database/Calibration/ImageRecord.cs b/GSS2.Core/Analysis/AmineContent/Database/Calibration/ImageRecord.cs index c4357a5..8fe1658 100644 --- a/GSS2.Core/Analysis/AmineContent/Database/Calibration/ImageRecord.cs +++ b/GSS2.Core/Analysis/AmineContent/Database/Calibration/ImageRecord.cs @@ -14,4 +14,14 @@ public record ImageRecord public required double Uv254Intensity { get; init; } [Comment("Путь к файлу изображения")] public required string ImagePath { get; init; } + + // 1:N + public int? SeparatorRecordId { get; set; } + public SeparatorRecord? Separator { get; set; } + + public int? CalibrationSampleId { get; set; } + public CalibrationRecord? CalibrationSample { get; set; } + + // M:N + public List UsedInCalibrations { get; set; } = new(); } diff --git a/GSS2.Core/Analysis/AmineContent/Database/Calibration/TrayRecord.cs b/GSS2.Core/Analysis/AmineContent/Database/Calibration/TrayRecord.cs deleted file mode 100644 index 6ffc854..0000000 --- a/GSS2.Core/Analysis/AmineContent/Database/Calibration/TrayRecord.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Microsoft.EntityFrameworkCore; - -namespace GSS2.Core.Analysis.AmineContent.Database.Calibration; - -public record TrayRecord -{ - [Comment("Уникальный идентификатор")] - public int Id { get; set; } - [Comment("Изображения лотка")] - public required List Images { get; init; } -} diff --git a/GSS2.Core/Analysis/AmineContent/Database/Results/20260227055822_AmineContentResultsInitial.Designer.cs b/GSS2.Core/Analysis/AmineContent/Database/Results/20260227093041_AmineContentResultsInitial.Designer.cs similarity index 99% rename from GSS2.Core/Analysis/AmineContent/Database/Results/20260227055822_AmineContentResultsInitial.Designer.cs rename to GSS2.Core/Analysis/AmineContent/Database/Results/20260227093041_AmineContentResultsInitial.Designer.cs index 41f8de9..d811a75 100644 --- a/GSS2.Core/Analysis/AmineContent/Database/Results/20260227055822_AmineContentResultsInitial.Designer.cs +++ b/GSS2.Core/Analysis/AmineContent/Database/Results/20260227093041_AmineContentResultsInitial.Designer.cs @@ -11,7 +11,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace GSS2.Core.Analysis.AmineContent.Database.Results { [DbContext(typeof(AmineContentResultsContext))] - [Migration("20260227055822_AmineContentResultsInitial")] + [Migration("20260227093041_AmineContentResultsInitial")] partial class AmineContentResultsInitial { /// diff --git a/GSS2.Core/Analysis/AmineContent/Database/Results/20260227055822_AmineContentResultsInitial.cs b/GSS2.Core/Analysis/AmineContent/Database/Results/20260227093041_AmineContentResultsInitial.cs similarity index 100% rename from GSS2.Core/Analysis/AmineContent/Database/Results/20260227055822_AmineContentResultsInitial.cs rename to GSS2.Core/Analysis/AmineContent/Database/Results/20260227093041_AmineContentResultsInitial.cs