refactor: AmineContent Database

This commit is contained in:
2026-02-27 08:58:33 +03:00
parent 102e56ec93
commit 64fa8090dc
22 changed files with 572 additions and 430 deletions
@@ -0,0 +1,208 @@
// <auto-generated />
using System;
using GSS2.Core.Analysis.AmineContent.Database.Calibration;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
#nullable disable
namespace GSS2.Core.Analysis.AmineContent.Database.Calibration
{
[DbContext(typeof(AmineContentCalibrationContext))]
[Migration("20260227055810_AmineContentCalibrationInitial")]
partial class AmineContentCalibrationInitial
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder.HasAnnotation("ProductVersion", "10.0.0");
modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.Calibration.CalibrationRecord", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER")
.HasComment("Уникальный идентификатор");
b.Property<double?>("MixtureActualRate")
.HasColumnType("REAL")
.HasComment("Фактический расход кондиционирующей смеси (кг/т)");
b.Property<double?>("MixtureAmineContent")
.HasColumnType("REAL")
.HasComment("Содержание аминов в кондиционирующей смеси (%)");
b.Property<string>("MixtureName")
.HasMaxLength(512)
.HasColumnType("TEXT")
.HasComment("Название используемой кондиционирующей смеси");
b.Property<double?>("MixtureNormalRate")
.HasColumnType("REAL")
.HasComment("Норма расхода кондиционирующей смеси (кг/т)");
b.Property<string>("SampleBrand")
.HasMaxLength(512)
.HasColumnType("TEXT")
.HasComment("Марка пробы");
b.Property<string>("SampleComment")
.HasMaxLength(2048)
.HasColumnType("TEXT")
.HasComment("Дополнительная информация о пробе");
b.Property<double?>("SampleMass")
.HasColumnType("REAL")
.HasComment("Масса пробы (кг)");
b.Property<string>("SampleName")
.HasMaxLength(512)
.HasColumnType("TEXT")
.HasComment("Название пробы");
b.Property<DateTime?>("SamplingDateTime")
.HasColumnType("TEXT")
.HasComment("Дата и время отбора пробы");
b.Property<string>("SamplingPlace")
.HasMaxLength(512)
.HasColumnType("TEXT")
.HasComment("Место отбора пробы");
b.HasKey("Id");
b.ToTable("CalibrationRecords");
});
modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.Calibration.ImageRecord", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER")
.HasComment("Уникальный идентификатор");
b.Property<int?>("CalibrationRecordId")
.HasColumnType("INTEGER");
b.Property<int?>("CalibrationRecordId1")
.HasColumnType("INTEGER");
b.Property<string>("ImagePath")
.IsRequired()
.HasMaxLength(1024)
.HasColumnType("TEXT")
.HasComment("Путь к файлу изображения");
b.Property<int?>("SeparatorRecordId")
.HasColumnType("INTEGER");
b.Property<int?>("TrayRecordId")
.HasColumnType("INTEGER");
b.Property<double>("Uv254Intensity")
.HasColumnType("REAL")
.HasComment("Интенсивность УФ излучения 254 нм (0..1)");
b.Property<double>("Uv365Intensity")
.HasColumnType("REAL")
.HasComment("Интенсивность УФ излучения 365 нм (0..1)");
b.Property<double>("VisibleIntensity")
.HasColumnType("REAL")
.HasComment("Интенсивность видимого света (0..1)");
b.HasKey("Id");
b.HasIndex("CalibrationRecordId");
b.HasIndex("CalibrationRecordId1");
b.HasIndex("SeparatorRecordId");
b.HasIndex("TrayRecordId");
b.ToTable("ImageRecords");
});
modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.Calibration.SeparatorRecord", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER")
.HasComment("Уникальный идентификатор");
b.Property<string>("Batch")
.IsRequired()
.HasMaxLength(256)
.HasColumnType("TEXT")
.HasComment("Партия сепаратора");
b.Property<string>("Type")
.IsRequired()
.HasMaxLength(256)
.HasColumnType("TEXT")
.HasComment("Тип сепаратора");
b.HasKey("Id");
b.ToTable("SeparatorRecords");
});
modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.Calibration.TrayRecord", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER")
.HasComment("Уникальный идентификатор");
b.HasKey("Id");
b.ToTable("TrayRecords");
});
modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.Calibration.ImageRecord", b =>
{
b.HasOne("GSS2.Core.Analysis.AmineContent.Database.Calibration.CalibrationRecord", null)
.WithMany("SampleImages")
.HasForeignKey("CalibrationRecordId")
.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)
.WithMany("Images")
.HasForeignKey("SeparatorRecordId")
.OnDelete(DeleteBehavior.Cascade);
b.HasOne("GSS2.Core.Analysis.AmineContent.Database.Calibration.TrayRecord", null)
.WithMany("Images")
.HasForeignKey("TrayRecordId")
.OnDelete(DeleteBehavior.Cascade);
});
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
}
}
}
@@ -0,0 +1,143 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace GSS2.Core.Analysis.AmineContent.Database.Calibration
{
/// <inheritdoc />
public partial class AmineContentCalibrationInitial : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "CalibrationRecords",
columns: table => new
{
Id = table.Column<int>(type: "INTEGER", nullable: false, comment: "Уникальный идентификатор")
.Annotation("Sqlite:Autoincrement", true),
SampleName = table.Column<string>(type: "TEXT", maxLength: 512, nullable: true, comment: "Название пробы"),
SampleComment = table.Column<string>(type: "TEXT", maxLength: 2048, nullable: true, comment: "Дополнительная информация о пробе"),
SampleBrand = table.Column<string>(type: "TEXT", maxLength: 512, nullable: true, comment: "Марка пробы"),
SampleMass = table.Column<double>(type: "REAL", nullable: true, comment: "Масса пробы (кг)"),
SamplingDateTime = table.Column<DateTime>(type: "TEXT", nullable: true, comment: "Дата и время отбора пробы"),
SamplingPlace = table.Column<string>(type: "TEXT", maxLength: 512, nullable: true, comment: "Место отбора пробы"),
MixtureName = table.Column<string>(type: "TEXT", maxLength: 512, nullable: true, comment: "Название используемой кондиционирующей смеси"),
MixtureAmineContent = table.Column<double>(type: "REAL", nullable: true, comment: "Содержание аминов в кондиционирующей смеси (%)"),
MixtureNormalRate = table.Column<double>(type: "REAL", nullable: true, comment: "Норма расхода кондиционирующей смеси (кг/т)"),
MixtureActualRate = table.Column<double>(type: "REAL", nullable: true, comment: "Фактический расход кондиционирующей смеси (кг/т)")
},
constraints: table =>
{
table.PrimaryKey("PK_CalibrationRecords", x => x.Id);
});
migrationBuilder.CreateTable(
name: "SeparatorRecords",
columns: table => new
{
Id = table.Column<int>(type: "INTEGER", nullable: false, comment: "Уникальный идентификатор")
.Annotation("Sqlite:Autoincrement", true),
Type = table.Column<string>(type: "TEXT", maxLength: 256, nullable: false, comment: "Тип сепаратора"),
Batch = table.Column<string>(type: "TEXT", maxLength: 256, nullable: false, comment: "Партия сепаратора")
},
constraints: table =>
{
table.PrimaryKey("PK_SeparatorRecords", x => x.Id);
});
migrationBuilder.CreateTable(
name: "TrayRecords",
columns: table => new
{
Id = table.Column<int>(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
{
Id = table.Column<int>(type: "INTEGER", nullable: false, comment: "Уникальный идентификатор")
.Annotation("Sqlite:Autoincrement", true),
VisibleIntensity = table.Column<double>(type: "REAL", nullable: false, comment: "Интенсивность видимого света (0..1)"),
Uv365Intensity = table.Column<double>(type: "REAL", nullable: false, comment: "Интенсивность УФ излучения 365 нм (0..1)"),
Uv254Intensity = table.Column<double>(type: "REAL", nullable: false, comment: "Интенсивность УФ излучения 254 нм (0..1)"),
ImagePath = table.Column<string>(type: "TEXT", maxLength: 1024, nullable: false, comment: "Путь к файлу изображения"),
CalibrationRecordId = table.Column<int>(type: "INTEGER", nullable: true),
CalibrationRecordId1 = table.Column<int>(type: "INTEGER", nullable: true),
SeparatorRecordId = table.Column<int>(type: "INTEGER", nullable: true),
TrayRecordId = table.Column<int>(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,
principalTable: "CalibrationRecords",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_ImageRecords_SeparatorRecords_SeparatorRecordId",
column: x => x.SeparatorRecordId,
principalTable: "SeparatorRecords",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_ImageRecords_TrayRecords_TrayRecordId",
column: x => x.TrayRecordId,
principalTable: "TrayRecords",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateIndex(
name: "IX_ImageRecords_CalibrationRecordId",
table: "ImageRecords",
column: "CalibrationRecordId");
migrationBuilder.CreateIndex(
name: "IX_ImageRecords_CalibrationRecordId1",
table: "ImageRecords",
column: "CalibrationRecordId1");
migrationBuilder.CreateIndex(
name: "IX_ImageRecords_SeparatorRecordId",
table: "ImageRecords",
column: "SeparatorRecordId");
migrationBuilder.CreateIndex(
name: "IX_ImageRecords_TrayRecordId",
table: "ImageRecords",
column: "TrayRecordId");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "ImageRecords");
migrationBuilder.DropTable(
name: "CalibrationRecords");
migrationBuilder.DropTable(
name: "SeparatorRecords");
migrationBuilder.DropTable(
name: "TrayRecords");
}
}
}
@@ -0,0 +1,75 @@
using Microsoft.EntityFrameworkCore;
namespace GSS2.Core.Analysis.AmineContent.Database.Calibration;
public class AmineContentCalibrationContext : DbContext
{
public DbSet<ImageRecord> ImageRecords => Set<ImageRecord>();
public DbSet<TrayRecord> TrayRecords => Set<TrayRecord>();
public DbSet<SeparatorRecord> SeparatorRecords => Set<SeparatorRecord>();
public DbSet<CalibrationRecord> CalibrationRecords => Set<CalibrationRecord>();
public AmineContentCalibrationContext(DbContextOptions<AmineContentCalibrationContext> options)
: base(options)
{ }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<ImageRecord>(entity =>
{
entity.HasKey(x => x.Id);
entity.Property(x => x.ImagePath)
.IsRequired()
.HasMaxLength(1024);
});
modelBuilder.Entity<TrayRecord>(entity =>
{
entity.HasKey(x => x.Id);
entity.HasMany(x => x.Images)
.WithOne()
.OnDelete(DeleteBehavior.Cascade);
});
modelBuilder.Entity<SeparatorRecord>(entity =>
{
entity.HasKey(x => x.Id);
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<CalibrationRecord>(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()
.OnDelete(DeleteBehavior.Cascade);
entity.HasMany(x => x.SeparatorImages)
.WithOne()
.OnDelete(DeleteBehavior.Cascade);
});
}
}
@@ -0,0 +1,18 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
namespace GSS2.Core.Analysis.AmineContent.Database.Calibration;
public class AmineContentCalibrationContextFactory : IDesignTimeDbContextFactory<AmineContentCalibrationContext>
{
public AmineContentCalibrationContext CreateDbContext(string[] args)
{
var optionsBuilder = new DbContextOptionsBuilder<AmineContentCalibrationContext>();
// Строка подключения для миграций в design-time
// в runtime должна использоваться настоящая ConnectionString
optionsBuilder.UseSqlite("Data Source=AmineContentCalibration.db");
return new AmineContentCalibrationContext(optionsBuilder.Options);
}
}
@@ -0,0 +1,205 @@
// <auto-generated />
using System;
using GSS2.Core.Analysis.AmineContent.Database.Calibration;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
#nullable disable
namespace GSS2.Core.Analysis.AmineContent.Database.Calibration
{
[DbContext(typeof(AmineContentCalibrationContext))]
partial class AmineContentCalibrationContextModelSnapshot : ModelSnapshot
{
protected override void BuildModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder.HasAnnotation("ProductVersion", "10.0.0");
modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.Calibration.CalibrationRecord", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER")
.HasComment("Уникальный идентификатор");
b.Property<double?>("MixtureActualRate")
.HasColumnType("REAL")
.HasComment("Фактический расход кондиционирующей смеси (кг/т)");
b.Property<double?>("MixtureAmineContent")
.HasColumnType("REAL")
.HasComment("Содержание аминов в кондиционирующей смеси (%)");
b.Property<string>("MixtureName")
.HasMaxLength(512)
.HasColumnType("TEXT")
.HasComment("Название используемой кондиционирующей смеси");
b.Property<double?>("MixtureNormalRate")
.HasColumnType("REAL")
.HasComment("Норма расхода кондиционирующей смеси (кг/т)");
b.Property<string>("SampleBrand")
.HasMaxLength(512)
.HasColumnType("TEXT")
.HasComment("Марка пробы");
b.Property<string>("SampleComment")
.HasMaxLength(2048)
.HasColumnType("TEXT")
.HasComment("Дополнительная информация о пробе");
b.Property<double?>("SampleMass")
.HasColumnType("REAL")
.HasComment("Масса пробы (кг)");
b.Property<string>("SampleName")
.HasMaxLength(512)
.HasColumnType("TEXT")
.HasComment("Название пробы");
b.Property<DateTime?>("SamplingDateTime")
.HasColumnType("TEXT")
.HasComment("Дата и время отбора пробы");
b.Property<string>("SamplingPlace")
.HasMaxLength(512)
.HasColumnType("TEXT")
.HasComment("Место отбора пробы");
b.HasKey("Id");
b.ToTable("CalibrationRecords");
});
modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.Calibration.ImageRecord", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER")
.HasComment("Уникальный идентификатор");
b.Property<int?>("CalibrationRecordId")
.HasColumnType("INTEGER");
b.Property<int?>("CalibrationRecordId1")
.HasColumnType("INTEGER");
b.Property<string>("ImagePath")
.IsRequired()
.HasMaxLength(1024)
.HasColumnType("TEXT")
.HasComment("Путь к файлу изображения");
b.Property<int?>("SeparatorRecordId")
.HasColumnType("INTEGER");
b.Property<int?>("TrayRecordId")
.HasColumnType("INTEGER");
b.Property<double>("Uv254Intensity")
.HasColumnType("REAL")
.HasComment("Интенсивность УФ излучения 254 нм (0..1)");
b.Property<double>("Uv365Intensity")
.HasColumnType("REAL")
.HasComment("Интенсивность УФ излучения 365 нм (0..1)");
b.Property<double>("VisibleIntensity")
.HasColumnType("REAL")
.HasComment("Интенсивность видимого света (0..1)");
b.HasKey("Id");
b.HasIndex("CalibrationRecordId");
b.HasIndex("CalibrationRecordId1");
b.HasIndex("SeparatorRecordId");
b.HasIndex("TrayRecordId");
b.ToTable("ImageRecords");
});
modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.Calibration.SeparatorRecord", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER")
.HasComment("Уникальный идентификатор");
b.Property<string>("Batch")
.IsRequired()
.HasMaxLength(256)
.HasColumnType("TEXT")
.HasComment("Партия сепаратора");
b.Property<string>("Type")
.IsRequired()
.HasMaxLength(256)
.HasColumnType("TEXT")
.HasComment("Тип сепаратора");
b.HasKey("Id");
b.ToTable("SeparatorRecords");
});
modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.Calibration.TrayRecord", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER")
.HasComment("Уникальный идентификатор");
b.HasKey("Id");
b.ToTable("TrayRecords");
});
modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.Calibration.ImageRecord", b =>
{
b.HasOne("GSS2.Core.Analysis.AmineContent.Database.Calibration.CalibrationRecord", null)
.WithMany("SampleImages")
.HasForeignKey("CalibrationRecordId")
.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)
.WithMany("Images")
.HasForeignKey("SeparatorRecordId")
.OnDelete(DeleteBehavior.Cascade);
b.HasOne("GSS2.Core.Analysis.AmineContent.Database.Calibration.TrayRecord", null)
.WithMany("Images")
.HasForeignKey("TrayRecordId")
.OnDelete(DeleteBehavior.Cascade);
});
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
}
}
}
@@ -0,0 +1,33 @@
using Microsoft.EntityFrameworkCore;
namespace GSS2.Core.Analysis.AmineContent.Database.Calibration;
public record CalibrationRecord
{
[Comment("Уникальный идентификатор")]
public int Id { get; set; }
[Comment("Название пробы")]
public required string? SampleName { get; init; }
[Comment("Дополнительная информация о пробе")]
public required string? SampleComment { get; init; }
[Comment("Марка пробы")]
public required string? SampleBrand { get; init; }
[Comment("Масса пробы (кг)")]
public required double? SampleMass { get; init; }
[Comment("Дата и время отбора пробы")]
public required DateTime? SamplingDateTime { get; init; }
[Comment("Место отбора пробы")]
public required string? SamplingPlace { get; init; }
[Comment("Название используемой кондиционирующей смеси")]
public required string? MixtureName { get; init; }
[Comment("Содержание аминов в кондиционирующей смеси (%)")]
public required double? MixtureAmineContent { get; init; }
[Comment("Норма расхода кондиционирующей смеси (кг/т)")]
public required double? MixtureNormalRate { get; init; }
[Comment("Фактический расход кондиционирующей смеси (кг/т)")]
public required double? MixtureActualRate { get; init; }
[Comment("Изображения пробы")]
public required List<ImageRecord> SampleImages { get; init; }
[Comment("Изображения пустого сепаратора")]
public required List<ImageRecord> SeparatorImages { get; init; }
}
@@ -0,0 +1,17 @@
using Microsoft.EntityFrameworkCore;
namespace GSS2.Core.Analysis.AmineContent.Database.Calibration;
public record ImageRecord
{
[Comment("Уникальный идентификатор")]
public int Id { get; set; }
[Comment("Интенсивность видимого света (0..1)")]
public required double VisibleIntensity { get; init; }
[Comment("Интенсивность УФ излучения 365 нм (0..1)")]
public required double Uv365Intensity { get; init; }
[Comment("Интенсивность УФ излучения 254 нм (0..1)")]
public required double Uv254Intensity { get; init; }
[Comment("Путь к файлу изображения")]
public required string ImagePath { get; init; }
}
@@ -0,0 +1,15 @@
using Microsoft.EntityFrameworkCore;
namespace GSS2.Core.Analysis.AmineContent.Database.Calibration;
public record SeparatorRecord
{
[Comment("Уникальный идентификатор")]
public int Id { get; set; }
[Comment("Тип сепаратора")]
public required string Type { get; init; }
[Comment("Партия сепаратора")]
public required string Batch { get; init; }
[Comment("Изображения сепаратора")]
public required List<ImageRecord> Images { get; init; }
}
@@ -0,0 +1,11 @@
using Microsoft.EntityFrameworkCore;
namespace GSS2.Core.Analysis.AmineContent.Database.Calibration;
public record TrayRecord
{
[Comment("Уникальный идентификатор")]
public int Id { get; set; }
[Comment("Изображения лотка")]
public required List<ImageRecord> Images { get; init; }
}