merge hhsung_work to prototype

hhsung_work
HyungJune Kim 10 months ago
commit ae31da2035

@ -2,16 +2,19 @@
using System.Collections.Generic;
using static Microsoft.EntityFrameworkCore.DbLoggerCategory;
namespace SmartAquaViewer.DataAnalisys
{
public class AppDbContext : DbContext
{
//dotnet ef migrations add InitialCreate
//dotnet ef database update
//dotnet ef migrations add AddMultipleTables
//dotnet ef database update
//dotnet tool install --global dotnet-ef
//dotnet ef migrations add InitialCreate --project SmartAquaViewer
//dotnet ef database update --project SmartAquaViewer
//dotnet ef migrations add AddMultipleTables --project SmartAquaViewer
//dotnet ef database update --project SmartAquaViewer
@ -19,9 +22,14 @@ namespace SmartAquaViewer.DataAnalisys
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
// SQL Server 예시 (필요에 맞게 변경)
optionsBuilder.UseSqlServer(
"Server=localhost;Database=SmartAquaDB;Trusted_Connection=True;TrustServerCertificate=True;");
// MySQL 연결 문자열 (일반적인 형태)
var connectionString = "Server=192.168.10.143;Port=3306;Database=smart_aqua;User=root;Password=znqk123!;";
// MySQL Server Version 설정 (버전에 맞춰 변경)
var serverVersion = new MySqlServerVersion(new Version(8, 0, 36));
optionsBuilder.UseMySql(connectionString, serverVersion);
}
}
}

@ -63,7 +63,7 @@ namespace SmartAquaViewer.DataAnalisys
// TODO: 라인 파싱 로직
WaterQualityVO vo = new();
vo.PH = 10.5;
//vo.PH = 10.5;
vo.Timestamp = DateTime.Now;
iwaterQuality.OnParsed(vo);

@ -11,6 +11,7 @@ namespace SmartAquaViewer.DataAnalisys
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Security.Policy;
[Table("WaterQuality")]
public class WaterQualityVO
@ -20,6 +21,156 @@ namespace SmartAquaViewer.DataAnalisys
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] // 자동 증가
public int Id { get; set; } // PK, Auto Increment
/// <summary>
/// 저수조
/// </summary>
public WaterTank WaterTank { get; set; }
/// <summary>
/// 여과 시스템
/// </summary>
public FilteringSystem FilteringSystem { get; set; }
/// <summary>
/// 살균 시스템
/// </summary>
public SterilizingSystem SterilizingSystem { get; set; }
/// <summary>
/// 측정 시각
/// </summary>
public DateTime Timestamp { get; set; }
public WaterQualityVO() { }
public WaterQualityVO(
int waterTankNum, double waterTankDOValue, double waterTankPh, double waterTankORP, double waterTankTemperature, double waterTankFlowRate,
bool sandFilterPower,
double sumpPH, double sumpORP, double sumpWaterLevel, double sumpFlowRate, double sumpTemperature,
bool circulationPumpPower, string? inverterControllerStatus, double flowRate,
bool heatPumpPower, double heatPumpTemperature, bool airBlowerPower,
bool ozoneGeneratorPower,
string uvSterilizerId, bool uvSterilizerPower,
bool ozoneDissolverPower, double ozoneDissolverPressure,
bool excessOzoneDestroyerPower,
DateTime timestamp)
{
WaterTank = new WaterTank(waterTankNum, waterTankDOValue, waterTankPh, waterTankORP, waterTankTemperature, waterTankFlowRate);
FilteringSystem = new FilteringSystem(sandFilterPower, sumpPH, sumpORP, sumpWaterLevel, sumpFlowRate, sumpTemperature,
circulationPumpPower, inverterControllerStatus, flowRate,
heatPumpPower, heatPumpTemperature, airBlowerPower);
SterilizingSystem = new SterilizingSystem(ozoneGeneratorPower, uvSterilizerId, uvSterilizerPower,
ozoneDissolverPower, ozoneDissolverPressure, excessOzoneDestroyerPower);
}
public override string ToString()
{
//return $"Tank#{WaterTankNum} [{Timestamp}] DO: {DO} mg/L, pH: {PH}, Temp: {Temperature}°C, " +
// $"Level: {WaterLevel} m, Flow: {FlowRate} m³/s, EC: {ElectricalConductivity} µS/cm, " +
// $"Turbidity: {Turbidity} NTU, Salinity: {Salinity} ppt, ORP: {ORP} mV, " +
// $"TSS: {TSS} mg/L, TN: {TotalNitrogen} mg/L, TP: {TotalPhosphorus} mg/L";
return $"[{Timestamp}] " +
$"[Tank#{WaterTank.WaterTankNum}, DO: {WaterTank.DO} mg/L, pH: {WaterTank.PH}, ORP: {WaterTank.ORP} mV, Temp: {WaterTank.Temperature}°C, FlowRate: {WaterTank.FlowRate} m³/s]" +
$"[SandFilter: {(FilteringSystem.SandFilterPower ? "ON" : "OFF")}, " +
$"(SumpTank) pH: {FilteringSystem.SumpPH}, ORP: {FilteringSystem.SumpORP} mV, WaterLevel: {FilteringSystem.SumpWaterLevel} m, FlowRate: {FilteringSystem.SumpFlowRate} m³/s, Temperature: {FilteringSystem.SumpTemperature}°C," +
$"HeatPump: {(FilteringSystem.HeatPumpPower ? "ON" : "OFF")}, HeatPumpTemperature: {FilteringSystem.HeatPumpTemperature}°C, AirBlower: {(FilteringSystem.AirBlowerPower ? "ON" : "OFF")}]" +
$"[OzoneGenerator: {(SterilizingSystem.OzoneGeneratorPower ? "ON" : "OFF")}," +
$"UVSterilizerId: {SterilizingSystem.UVSterilizerId}, UVSterilizer: {(SterilizingSystem.UVSterilizerPower ? "ON" : "OFF")}," +
$"OzoneDissolver: {SterilizingSystem.OzoneDissolverPower}, OzoneDissolverPressure: {SterilizingSystem.OzoneDissolverPressure} kPa," +
$"ExcessOzoneDestroyer: {(SterilizingSystem.ExcessOzoneDestroyerPower ? "ON" : "OFF")}]";
}
/// <summary>
/// 지정 기간 동안 임의의 수질 데이터를 생성합니다.
/// </summary>
public static List<WaterQualityVO> GetSampleData(DateTime start, DateTime end, int totalRowsCount)
{
var list = new List<WaterQualityVO>();
var rand = new Random();
if (totalRowsCount <= 0) return list;
double totalSeconds;
if (start == end)
{
// 같은 날짜면 하루(24시간) 기준으로 균등 분할
totalSeconds = 24 * 60 * 60; // 86,400초
}
else
{
totalSeconds = (end - start).TotalSeconds;
if (totalSeconds < 0) throw new ArgumentException("end 날짜는 start 날짜보다 같거나 커야 합니다.");
}
double stepSeconds = totalSeconds / totalRowsCount;
for (int i = 0; i < totalRowsCount; i++)
{
DateTime ts = start.AddSeconds(stepSeconds * i);
//var vo = new WaterQualityVO
//{
// WaterTankNum = rand.Next(1, 6), // 1~5번 탱크
// DO = Math.Round(rand.NextDouble() * 5 + 5, 2), // 5~10 mg/L
// PH = Math.Round(rand.NextDouble() * 2 + 6, 2), // 6~8
// Temperature = Math.Round(rand.NextDouble() * 10 + 15, 2), // 15~25°C
// WaterLevel = Math.Round(rand.NextDouble() * 2 + 1, 2), // 1~3 m
// FlowRate = Math.Round(rand.NextDouble() * 5 + 1, 2), // 1~6 m³/s
// ElectricalConductivity = Math.Round(rand.NextDouble() * 500 + 200, 2), // 200~700 µS/cm
// Turbidity = Math.Round(rand.NextDouble() * 5 + 1, 2), // 1~6 NTU
// Salinity = Math.Round(rand.NextDouble() * 5, 2), // 0~5 ppt
// ORP = Math.Round(rand.NextDouble() * 200 + 100, 2), // 100~300 mV
// TSS = Math.Round(rand.NextDouble() * 20 + 5, 2), // 5~25 mg/L
// TotalNitrogen = Math.Round(rand.NextDouble() * 2 + 0.5, 2), // 0.5~2.5 mg/L
// TotalPhosphorus = Math.Round(rand.NextDouble() * 0.5 + 0.05, 3), // 0.05~0.55 mg/L
// Timestamp = ts
//};
var vo = new WaterQualityVO
{
WaterTank = new WaterTank(
waterTankNum: rand.Next(1, 6), // 1~5번 탱크
doValue: Math.Round(rand.NextDouble() * 5 + 5, 2), // 5~10 mg/L
ph: Math.Round(rand.NextDouble() * 2 + 6, 2), // 6~8
orp: Math.Round(rand.NextDouble() * 200 + 100, 2), // 100~300 mV
temperature: Math.Round(rand.NextDouble() * 10 + 15, 2), // 15~25°C
flowRate: Math.Round(rand.NextDouble() * 5 + 1, 2) // 1~6 m³/s
),
FilteringSystem = new FilteringSystem(
sandFilterPower: rand.Next(0, 2) == 1, // true or false
sumpPH: Math.Round(rand.NextDouble() * 2 + 6, 2), // 6~8
sumpORP: Math.Round(rand.NextDouble() * 200 + 100, 2), // 100~300 mV
sumpWaterLevel: Math.Round(rand.NextDouble() * 2 + 1, 2), // 1~3 m
sumpFlowRate: Math.Round(rand.NextDouble() * 5 + 1, 2), // 1~6 m³/s
sumpTemperature: Math.Round(rand.NextDouble() * 10 + 15, 2), // 15~25°C
circulationPumpPower: rand.Next(0, 2) == 1, // true or false
inverterControllerStatus: rand.Next(0, 2) == 1 ? "Normal" : "Error", // "Normal" or "Error"
flowRate: Math.Round(rand.NextDouble() * 5 + 1, 2), // 1~6 m³/s
heatPumpPower: rand.Next(0, 2) == 1, // true or false
heatPumpTemperature: Math.Round(rand.NextDouble() * 10 + 15, 2), // 15~25°C
airBlowerPower: rand.Next(0, 2) == 1 // true or false
),
SterilizingSystem = new SterilizingSystem(
ozoneGeneratorPower: rand.Next(0, 2) == 1, // true or false
uvSterilizerId: "UV" + rand.Next(1, 100), // UV1, UV2, ...
uvSterilizerPower: rand.Next(0, 2) == 1, // true or false
ozoneDissolverPower: rand.Next(0, 2) == 1, // true or false
ozoneDissolverPressure: Math.Round(rand.NextDouble() * 100 + 50, 2), // 50~150 kPa
excessOzoneDestroyerPower: rand.Next(0, 2) == 1 // true or false
)
};
list.Add(vo);
}
return list;
}
}
public class WaterTank
{
/// <summary>
/// 저수조 번호
/// </summary>
@ -36,145 +187,157 @@ namespace SmartAquaViewer.DataAnalisys
public double PH { get; set; }
/// <summary>
/// 수온 (°C)
/// 산화환원전위 (mV)
/// </summary>
public double Temperature { get; set; }
public double ORP { get; set; }
/// <summary>
/// 수위 (m)
/// 수온 (°C)
/// </summary>
public double WaterLevel { get; set; }
public double Temperature { get; set; }
/// <summary>
/// 유량 (m³/s)
/// </summary>
public double FlowRate { get; set; }
public WaterTank(int waterTankNum, double doValue, double ph, double orp, double temperature, double flowRate)
{
WaterTankNum = waterTankNum;
DO = doValue;
PH = ph;
ORP = orp;
Temperature = temperature;
FlowRate = flowRate;
}
}
public class FilteringSystem
{
/// <summary>
/// 전기전도도 (µS/cm)
/// 모래여과기 전원 (true: ON, false: OFF)
/// </summary>
public double ElectricalConductivity { get; set; }
public bool SandFilterPower { get; set; }
/// <summary>
/// 탁도 (NTU)
/// 섬프탱크 pH (산도)
/// </summary>
public double Turbidity { get; set; }
public double SumpPH { get; set; }
/// <summary>
/// 염도 (ppt)
/// 섬프탱크 산화환원전위 (mV)
/// </summary>
public double Salinity { get; set; }
public double SumpORP { get; set; }
/// <summary>
/// 산화환원전위 (mV)
/// 섬프탱크 수위 (m)
/// </summary>
public double ORP { get; set; }
public double SumpWaterLevel { get; set; }
/// <summary>
/// 총부유물질 (mg/L)
/// 섬프탱크 유량 (m³/s)
/// </summary>
public double TSS { get; set; }
public double SumpFlowRate { get; set; }
/// <summary>
/// 총질소 (mg/L)
/// 섬프탱크 수온 (°C)
/// </summary>
public double TotalNitrogen { get; set; }
public double SumpTemperature { get; set; }
/// <summary>
/// 총인 (mg/L)
/// 순환펌프 전원 (true: ON, false: OFF)
/// </summary>
public double TotalPhosphorus { get; set; }
public bool CirculationPumpPower { get; set; }
/// <summary>
/// 측정 시각
/// 인버터 제어기 상태
/// </summary>
public DateTime Timestamp { get; set; }
public WaterQualityVO() { }
public WaterQualityVO(int waterTankNum, double doValue, double ph, double temperature, double waterLevel, double flowRate,
double electricalConductivity, double turbidity, double salinity, double orp,
double tss, double totalNitrogen, double totalPhosphorus, DateTime timestamp)
{
WaterTankNum = waterTankNum;
DO = doValue;
PH = ph;
Temperature = temperature;
WaterLevel = waterLevel;
FlowRate = flowRate;
ElectricalConductivity = electricalConductivity;
Turbidity = turbidity;
Salinity = salinity;
ORP = orp;
TSS = tss;
TotalNitrogen = totalNitrogen;
TotalPhosphorus = totalPhosphorus;
Timestamp = timestamp;
}
public string? InverterControllerStatus { get; set; }
public override string ToString()
{
return $"Tank#{WaterTankNum} [{Timestamp}] DO: {DO} mg/L, pH: {PH}, Temp: {Temperature}°C, " +
$"Level: {WaterLevel} m, Flow: {FlowRate} m³/s, EC: {ElectricalConductivity} µS/cm, " +
$"Turbidity: {Turbidity} NTU, Salinity: {Salinity} ppt, ORP: {ORP} mV, " +
$"TSS: {TSS} mg/L, TN: {TotalNitrogen} mg/L, TP: {TotalPhosphorus} mg/L";
}
/// <summary>
/// 순환펌프 유량 (m³/s)
/// </summary>
public double FlowRate { get; set; }
/// <summary>
/// 지정 기간 동안 임의의 수질 데이터를 생성합니다.
/// 히트펌프 전원 (true: ON, false: OFF)
/// </summary>
public static List<WaterQualityVO> GetSampleData(DateTime start, DateTime end, int totalRowsCount)
{
var list = new List<WaterQualityVO>();
var rand = new Random();
public bool HeatPumpPower { get; set; }
if (totalRowsCount <= 0) return list;
/// <summary>
/// 히트펌프 온도 (°C)
/// </summary>
public double HeatPumpTemperature { get; set; }
double totalSeconds;
/// <summary>
/// 에어브로와 전원 (true: ON, false: OFF)
/// </summary>
public bool AirBlowerPower { get; set; }
if (start == end)
public FilteringSystem(bool sandFilterPower,
double sumpPH, double sumpORP, double sumpWaterLevel, double sumpFlowRate, double sumpTemperature,
bool circulationPumpPower, string? inverterControllerStatus, double flowRate,
bool heatPumpPower, double heatPumpTemperature, bool airBlowerPower)
{
// 같은 날짜면 하루(24시간) 기준으로 균등 분할
totalSeconds = 24 * 60 * 60; // 86,400초
SandFilterPower = sandFilterPower;
SumpPH = sumpPH;
SumpORP = sumpORP;
SumpWaterLevel = sumpWaterLevel;
SumpFlowRate = sumpFlowRate;
SumpTemperature = sumpTemperature;
CirculationPumpPower = circulationPumpPower;
InverterControllerStatus = inverterControllerStatus;
FlowRate = flowRate;
HeatPumpPower = heatPumpPower;
HeatPumpTemperature = heatPumpTemperature;
AirBlowerPower = airBlowerPower;
}
else
{
totalSeconds = (end - start).TotalSeconds;
if (totalSeconds < 0) throw new ArgumentException("end 날짜는 start 날짜보다 같거나 커야 합니다.");
}
double stepSeconds = totalSeconds / totalRowsCount;
for (int i = 0; i < totalRowsCount; i++)
public class SterilizingSystem
{
DateTime ts = start.AddSeconds(stepSeconds * i);
var vo = new WaterQualityVO
{
WaterTankNum = rand.Next(1, 6), // 1~5번 탱크
DO = Math.Round(rand.NextDouble() * 5 + 5, 2), // 5~10 mg/L
PH = Math.Round(rand.NextDouble() * 2 + 6, 2), // 6~8
Temperature = Math.Round(rand.NextDouble() * 10 + 15, 2), // 15~25°C
WaterLevel = Math.Round(rand.NextDouble() * 2 + 1, 2), // 1~3 m
FlowRate = Math.Round(rand.NextDouble() * 5 + 1, 2), // 1~6 m³/s
ElectricalConductivity = Math.Round(rand.NextDouble() * 500 + 200, 2), // 200~700 µS/cm
Turbidity = Math.Round(rand.NextDouble() * 5 + 1, 2), // 1~6 NTU
Salinity = Math.Round(rand.NextDouble() * 5, 2), // 0~5 ppt
ORP = Math.Round(rand.NextDouble() * 200 + 100, 2), // 100~300 mV
TSS = Math.Round(rand.NextDouble() * 20 + 5, 2), // 5~25 mg/L
TotalNitrogen = Math.Round(rand.NextDouble() * 2 + 0.5, 2), // 0.5~2.5 mg/L
TotalPhosphorus = Math.Round(rand.NextDouble() * 0.5 + 0.05, 3), // 0.05~0.55 mg/L
Timestamp = ts
};
/// <summary>
/// 오존 발생기 전원 (true: ON, false: OFF)
/// </summary>
public bool OzoneGeneratorPower { get; set; }
list.Add(vo);
}
/// <summary>
/// 자외선 살균기 ID
/// </summary>
public string UVSterilizerId { get; set; }
return list;
}
/// <summary>
/// 자외선 살균기 전원 (true: ON, false: OFF)
/// </summary>
public bool UVSterilizerPower { get; set; }
}
/// <summary>
/// 오존용해장치 전원 (true: ON, false: OFF)
/// </summary>
public bool OzoneDissolverPower { get; set; }
/// <summary>
/// 오존용해장치 압력 (kPa)
/// </summary>
public double OzoneDissolverPressure { get; set; }
/// <summary>
/// 배오존장치 전원 (true: ON, false: OFF)
/// </summary>
public bool ExcessOzoneDestroyerPower { get; set; }
public SterilizingSystem(bool ozoneGeneratorPower,
string uvSterilizerId, bool uvSterilizerPower,
bool ozoneDissolverPower, double ozoneDissolverPressure,
bool excessOzoneDestroyerPower)
{
OzoneGeneratorPower = ozoneGeneratorPower;
UVSterilizerId = uvSterilizerId;
UVSterilizerPower = uvSterilizerPower;
OzoneDissolverPower = ozoneDissolverPower;
OzoneDissolverPressure = ozoneDissolverPressure;
ExcessOzoneDestroyerPower = excessOzoneDestroyerPower;
}
}
}

@ -0,0 +1,80 @@
// <auto-generated />
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using SmartAquaViewer.DataAnalisys;
#nullable disable
namespace SmartAquaViewer.Migrations
{
[DbContext(typeof(AppDbContext))]
[Migration("20250811050443_InitialCreate")]
partial class InitialCreate
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "8.0.1")
.HasAnnotation("Relational:MaxIdentifierLength", 64);
modelBuilder.Entity("SmartAquaViewer.DataAnalisys.WaterQualityVO", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
b.Property<double>("DO")
.HasColumnType("double");
b.Property<double>("ElectricalConductivity")
.HasColumnType("double");
b.Property<double>("FlowRate")
.HasColumnType("double");
b.Property<double>("ORP")
.HasColumnType("double");
b.Property<double>("PH")
.HasColumnType("double");
b.Property<double>("Salinity")
.HasColumnType("double");
b.Property<double>("TSS")
.HasColumnType("double");
b.Property<double>("Temperature")
.HasColumnType("double");
b.Property<DateTime>("Timestamp")
.HasColumnType("datetime(6)");
b.Property<double>("TotalNitrogen")
.HasColumnType("double");
b.Property<double>("TotalPhosphorus")
.HasColumnType("double");
b.Property<double>("Turbidity")
.HasColumnType("double");
b.Property<double>("WaterLevel")
.HasColumnType("double");
b.Property<int>("WaterTankNum")
.HasColumnType("int");
b.HasKey("Id");
b.ToTable("WaterQuality");
});
#pragma warning restore 612, 618
}
}
}

@ -0,0 +1,53 @@
using System;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace SmartAquaViewer.Migrations
{
/// <inheritdoc />
public partial class InitialCreate : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AlterDatabase()
.Annotation("MySql:CharSet", "utf8mb4");
migrationBuilder.CreateTable(
name: "WaterQuality",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
WaterTankNum = table.Column<int>(type: "int", nullable: false),
DO = table.Column<double>(type: "double", nullable: false),
PH = table.Column<double>(type: "double", nullable: false),
Temperature = table.Column<double>(type: "double", nullable: false),
WaterLevel = table.Column<double>(type: "double", nullable: false),
FlowRate = table.Column<double>(type: "double", nullable: false),
ElectricalConductivity = table.Column<double>(type: "double", nullable: false),
Turbidity = table.Column<double>(type: "double", nullable: false),
Salinity = table.Column<double>(type: "double", nullable: false),
ORP = table.Column<double>(type: "double", nullable: false),
TSS = table.Column<double>(type: "double", nullable: false),
TotalNitrogen = table.Column<double>(type: "double", nullable: false),
TotalPhosphorus = table.Column<double>(type: "double", nullable: false),
Timestamp = table.Column<DateTime>(type: "datetime(6)", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_WaterQuality", x => x.Id);
})
.Annotation("MySql:CharSet", "utf8mb4");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "WaterQuality");
}
}
}

@ -0,0 +1,77 @@
// <auto-generated />
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using SmartAquaViewer.DataAnalisys;
#nullable disable
namespace SmartAquaViewer.Migrations
{
[DbContext(typeof(AppDbContext))]
partial class AppDbContextModelSnapshot : ModelSnapshot
{
protected override void BuildModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "8.0.1")
.HasAnnotation("Relational:MaxIdentifierLength", 64);
modelBuilder.Entity("SmartAquaViewer.DataAnalisys.WaterQualityVO", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
b.Property<double>("DO")
.HasColumnType("double");
b.Property<double>("ElectricalConductivity")
.HasColumnType("double");
b.Property<double>("FlowRate")
.HasColumnType("double");
b.Property<double>("ORP")
.HasColumnType("double");
b.Property<double>("PH")
.HasColumnType("double");
b.Property<double>("Salinity")
.HasColumnType("double");
b.Property<double>("TSS")
.HasColumnType("double");
b.Property<double>("Temperature")
.HasColumnType("double");
b.Property<DateTime>("Timestamp")
.HasColumnType("datetime(6)");
b.Property<double>("TotalNitrogen")
.HasColumnType("double");
b.Property<double>("TotalPhosphorus")
.HasColumnType("double");
b.Property<double>("Turbidity")
.HasColumnType("double");
b.Property<double>("WaterLevel")
.HasColumnType("double");
b.Property<int>("WaterTankNum")
.HasColumnType("int");
b.HasKey("Id");
b.ToTable("WaterQuality");
});
#pragma warning restore 612, 618
}
}
}
Loading…
Cancel
Save