From 6520eab6a2fca3dbf53044b84da164be66db8344 Mon Sep 17 00:00:00 2001 From: prodigygirl Date: Fri, 7 Apr 2023 14:57:17 +0400 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5:=20=D0=BF=D0=BE=D0=BB=D0=B5=20treatmen?= =?UTF-8?q?tId=20=D1=83=20=D0=BF=D0=B0=D1=86=D0=B8=D0=B5=D0=BD=D1=82=D0=B0?= =?UTF-8?q?=20=D1=82=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20nullable?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Hospital/HospitalBusinessLogic/ReportLogic.cs | 3 +- .../BindingModels/PatientBindingModel.cs | 2 +- .../ViewModels/PatientViewModel.cs | 6 +- .../Models/IPatientModel.cs | 2 +- .../HospitalDatabase.cs | 6 + .../20230407105259_FixPatient.Designer.cs | 467 ++++++++++++++++++ .../Migrations/20230407105259_FixPatient.cs | 60 +++ .../HospitalDatabaseModelSnapshot.cs | 5 +- .../Models/Patient.cs | 13 +- 9 files changed, 546 insertions(+), 18 deletions(-) create mode 100644 Hospital/HospitalDatabaseImplement/Migrations/20230407105259_FixPatient.Designer.cs create mode 100644 Hospital/HospitalDatabaseImplement/Migrations/20230407105259_FixPatient.cs diff --git a/Hospital/HospitalBusinessLogic/ReportLogic.cs b/Hospital/HospitalBusinessLogic/ReportLogic.cs index 7cc4a29..6453793 100644 --- a/Hospital/HospitalBusinessLogic/ReportLogic.cs +++ b/Hospital/HospitalBusinessLogic/ReportLogic.cs @@ -3,6 +3,7 @@ using HospitalContracts.BusinessLogicContracts; using HospitalContracts.SearchModels; using HospitalContracts.StorageContracts; using HospitalContracts.ViewModels; +using System.Linq; namespace HospitalBusinessLogic { @@ -44,7 +45,7 @@ namespace HospitalBusinessLogic var treatments = _treatmentStorage.GetFullList().Where(x => (x.TreatmentProcedures.Keys.Intersect(procedures).Any() || treatmentsInRecipes.Contains(x.Id))).Select(x => x.Id); // получаем список пациентов, которые связаны с найденными лечениями - var patients = _patientStorage.GetFullList().Where(x => treatments.Contains(x.TreatmentId)); + var patients = _patientStorage.GetFullList().Where(x => x.TreatmentId.HasValue).Where(x => treatments.Contains(x.TreatmentId!.Value)); var record = new ReportPatientsMedicinesViewModel { diff --git a/Hospital/HospitalContracts/BindingModels/PatientBindingModel.cs b/Hospital/HospitalContracts/BindingModels/PatientBindingModel.cs index e33df2d..7ac2065 100644 --- a/Hospital/HospitalContracts/BindingModels/PatientBindingModel.cs +++ b/Hospital/HospitalContracts/BindingModels/PatientBindingModel.cs @@ -14,6 +14,6 @@ namespace HospitalContracts.BindingModels public DateTime BirthDate { get; set; } - public int TreatmentId { get; set; } + public int? TreatmentId { get; set; } } } diff --git a/Hospital/HospitalContracts/ViewModels/PatientViewModel.cs b/Hospital/HospitalContracts/ViewModels/PatientViewModel.cs index 585f489..368cb54 100644 --- a/Hospital/HospitalContracts/ViewModels/PatientViewModel.cs +++ b/Hospital/HospitalContracts/ViewModels/PatientViewModel.cs @@ -15,11 +15,11 @@ namespace HospitalContracts.ViewModels public string Name { get; set; } = string.Empty; - public string Patronymic { get; set; } = string.Empty; + public string? Patronymic { get; set; } = string.Empty; public DateTime BirthDate { get; set; } - public int TreatmentId { get; set; } - public string TreatmentName { get; set; } = string.Empty; + public int? TreatmentId { get; set; } + public string? TreatmentName { get; set; } = string.Empty; } } diff --git a/Hospital/HospitalDataModels/Models/IPatientModel.cs b/Hospital/HospitalDataModels/Models/IPatientModel.cs index c672536..bd5dd4a 100644 --- a/Hospital/HospitalDataModels/Models/IPatientModel.cs +++ b/Hospital/HospitalDataModels/Models/IPatientModel.cs @@ -6,6 +6,6 @@ string Name { get; } string? Patronymic { get; } DateTime BirthDate { get; } - int TreatmentId { get; } + int? TreatmentId { get; } } } diff --git a/Hospital/HospitalDatabaseImplement/HospitalDatabase.cs b/Hospital/HospitalDatabaseImplement/HospitalDatabase.cs index e00d55a..e8d7906 100644 --- a/Hospital/HospitalDatabaseImplement/HospitalDatabase.cs +++ b/Hospital/HospitalDatabaseImplement/HospitalDatabase.cs @@ -39,6 +39,12 @@ namespace HospitalDatabaseImplement .Entity().HasOne(e => e.Apothecary) .WithMany(e => e.Prescriptions) .OnDelete(DeleteBehavior.Restrict); + // при удалении лечения зануляем данное поле у пациентов + // можно было ввести статус записи лечения - активный/неактивный, но по заданию функционала удаления лечений нет + modelBuilder + .Entity().HasOne(e => e.Treatment) + .WithMany(e => e.Patients) + .OnDelete(DeleteBehavior.SetNull); } public virtual DbSet Apothecaries { set; get; } public virtual DbSet Recipes { set; get; } diff --git a/Hospital/HospitalDatabaseImplement/Migrations/20230407105259_FixPatient.Designer.cs b/Hospital/HospitalDatabaseImplement/Migrations/20230407105259_FixPatient.Designer.cs new file mode 100644 index 0000000..9b79e82 --- /dev/null +++ b/Hospital/HospitalDatabaseImplement/Migrations/20230407105259_FixPatient.Designer.cs @@ -0,0 +1,467 @@ +// +using System; +using HospitalDatabaseImplement; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace HospitalDatabaseImplement.Migrations +{ + [DbContext(typeof(HospitalDatabase))] + [Migration("20230407105259_FixPatient")] + partial class FixPatient + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.4") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("HospitalDatabaseImplement.Models.Apothecary", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Login") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Password") + .IsRequired() + .HasMaxLength(55) + .HasColumnType("nvarchar(55)"); + + b.HasKey("Id"); + + b.ToTable("Apothecaries"); + }); + + modelBuilder.Entity("HospitalDatabaseImplement.Models.Medicine", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ApothecaryId") + .HasColumnType("int"); + + b.Property("Cost") + .HasColumnType("float"); + + b.Property("Dose") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("nvarchar(10)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(60) + .HasColumnType("nvarchar(60)"); + + b.HasKey("Id"); + + b.HasIndex("ApothecaryId"); + + b.ToTable("Medicines"); + }); + + modelBuilder.Entity("HospitalDatabaseImplement.Models.Patient", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("BirthDate") + .HasColumnType("datetime2"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Patronymic") + .HasColumnType("nvarchar(max)"); + + b.Property("Surname") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("TreatmentId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("TreatmentId"); + + b.ToTable("Patients"); + }); + + modelBuilder.Entity("HospitalDatabaseImplement.Models.Prescription", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ApothecaryId") + .HasColumnType("int"); + + b.Property("Date") + .HasColumnType("datetime2"); + + b.Property("MedicineId") + .HasColumnType("int"); + + b.Property("Number") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ApothecaryId"); + + b.HasIndex("MedicineId"); + + b.ToTable("Prescriptions"); + }); + + modelBuilder.Entity("HospitalDatabaseImplement.Models.Procedure", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.HasKey("Id"); + + b.ToTable("Procedures"); + }); + + modelBuilder.Entity("HospitalDatabaseImplement.Models.ProcedureMedicine", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("MedicineId") + .HasColumnType("int"); + + b.Property("ProcedureId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("MedicineId"); + + b.HasIndex("ProcedureId"); + + b.ToTable("ProcedureMedicines"); + }); + + modelBuilder.Entity("HospitalDatabaseImplement.Models.Recipe", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ApothecaryId") + .HasColumnType("int"); + + b.Property("Date") + .HasColumnType("datetime2"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.HasKey("Id"); + + b.HasIndex("ApothecaryId"); + + b.ToTable("Recipes"); + }); + + modelBuilder.Entity("HospitalDatabaseImplement.Models.RecipeMedicine", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("MedicineId") + .HasColumnType("int"); + + b.Property("RecipeId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("MedicineId"); + + b.HasIndex("RecipeId"); + + b.ToTable("RecipeMedicines"); + }); + + modelBuilder.Entity("HospitalDatabaseImplement.Models.RecipeTreatment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("RecipeId") + .HasColumnType("int"); + + b.Property("TreatmentId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("RecipeId"); + + b.HasIndex("TreatmentId"); + + b.ToTable("RecipeTreatments"); + }); + + modelBuilder.Entity("HospitalDatabaseImplement.Models.Treatment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasMaxLength(55) + .HasColumnType("nvarchar(55)"); + + b.HasKey("Id"); + + b.ToTable("Treatments"); + }); + + modelBuilder.Entity("HospitalDatabaseImplement.Models.TreatmentProcedure", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ProcedureId") + .HasColumnType("int"); + + b.Property("TreatmentId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ProcedureId"); + + b.HasIndex("TreatmentId"); + + b.ToTable("TreatmentProcedures"); + }); + + modelBuilder.Entity("HospitalDatabaseImplement.Models.Medicine", b => + { + b.HasOne("HospitalDatabaseImplement.Models.Apothecary", "Apothecary") + .WithMany("Medicines") + .HasForeignKey("ApothecaryId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("Apothecary"); + }); + + modelBuilder.Entity("HospitalDatabaseImplement.Models.Patient", b => + { + b.HasOne("HospitalDatabaseImplement.Models.Treatment", "Treatment") + .WithMany("Patients") + .HasForeignKey("TreatmentId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Treatment"); + }); + + modelBuilder.Entity("HospitalDatabaseImplement.Models.Prescription", b => + { + b.HasOne("HospitalDatabaseImplement.Models.Apothecary", "Apothecary") + .WithMany("Prescriptions") + .HasForeignKey("ApothecaryId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("HospitalDatabaseImplement.Models.Medicine", "Medicine") + .WithMany("Prescriptions") + .HasForeignKey("MedicineId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Apothecary"); + + b.Navigation("Medicine"); + }); + + modelBuilder.Entity("HospitalDatabaseImplement.Models.ProcedureMedicine", b => + { + b.HasOne("HospitalDatabaseImplement.Models.Medicine", "Medicine") + .WithMany("Procedures") + .HasForeignKey("MedicineId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("HospitalDatabaseImplement.Models.Procedure", "Procedure") + .WithMany("Medicines") + .HasForeignKey("ProcedureId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Medicine"); + + b.Navigation("Procedure"); + }); + + modelBuilder.Entity("HospitalDatabaseImplement.Models.Recipe", b => + { + b.HasOne("HospitalDatabaseImplement.Models.Apothecary", "Apothecary") + .WithMany("Recipes") + .HasForeignKey("ApothecaryId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("Apothecary"); + }); + + modelBuilder.Entity("HospitalDatabaseImplement.Models.RecipeMedicine", b => + { + b.HasOne("HospitalDatabaseImplement.Models.Medicine", "Medicine") + .WithMany("Recipes") + .HasForeignKey("MedicineId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("HospitalDatabaseImplement.Models.Recipe", "Recipe") + .WithMany("Medicines") + .HasForeignKey("RecipeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Medicine"); + + b.Navigation("Recipe"); + }); + + modelBuilder.Entity("HospitalDatabaseImplement.Models.RecipeTreatment", b => + { + b.HasOne("HospitalDatabaseImplement.Models.Recipe", "Recipe") + .WithMany("Treatments") + .HasForeignKey("RecipeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("HospitalDatabaseImplement.Models.Treatment", "Treatment") + .WithMany("Recipes") + .HasForeignKey("TreatmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Recipe"); + + b.Navigation("Treatment"); + }); + + modelBuilder.Entity("HospitalDatabaseImplement.Models.TreatmentProcedure", b => + { + b.HasOne("HospitalDatabaseImplement.Models.Procedure", "Procedure") + .WithMany("Treatments") + .HasForeignKey("ProcedureId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("HospitalDatabaseImplement.Models.Treatment", "Treatment") + .WithMany("Procedures") + .HasForeignKey("TreatmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Procedure"); + + b.Navigation("Treatment"); + }); + + modelBuilder.Entity("HospitalDatabaseImplement.Models.Apothecary", b => + { + b.Navigation("Medicines"); + + b.Navigation("Prescriptions"); + + b.Navigation("Recipes"); + }); + + modelBuilder.Entity("HospitalDatabaseImplement.Models.Medicine", b => + { + b.Navigation("Prescriptions"); + + b.Navigation("Procedures"); + + b.Navigation("Recipes"); + }); + + modelBuilder.Entity("HospitalDatabaseImplement.Models.Procedure", b => + { + b.Navigation("Medicines"); + + b.Navigation("Treatments"); + }); + + modelBuilder.Entity("HospitalDatabaseImplement.Models.Recipe", b => + { + b.Navigation("Medicines"); + + b.Navigation("Treatments"); + }); + + modelBuilder.Entity("HospitalDatabaseImplement.Models.Treatment", b => + { + b.Navigation("Patients"); + + b.Navigation("Procedures"); + + b.Navigation("Recipes"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Hospital/HospitalDatabaseImplement/Migrations/20230407105259_FixPatient.cs b/Hospital/HospitalDatabaseImplement/Migrations/20230407105259_FixPatient.cs new file mode 100644 index 0000000..75114a5 --- /dev/null +++ b/Hospital/HospitalDatabaseImplement/Migrations/20230407105259_FixPatient.cs @@ -0,0 +1,60 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace HospitalDatabaseImplement.Migrations +{ + /// + public partial class FixPatient : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Patients_Treatments_TreatmentId", + table: "Patients"); + + migrationBuilder.AlterColumn( + name: "TreatmentId", + table: "Patients", + type: "int", + nullable: true, + oldClrType: typeof(int), + oldType: "int"); + + migrationBuilder.AddForeignKey( + name: "FK_Patients_Treatments_TreatmentId", + table: "Patients", + column: "TreatmentId", + principalTable: "Treatments", + principalColumn: "Id", + onDelete: ReferentialAction.SetNull); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Patients_Treatments_TreatmentId", + table: "Patients"); + + migrationBuilder.AlterColumn( + name: "TreatmentId", + table: "Patients", + type: "int", + nullable: false, + defaultValue: 0, + oldClrType: typeof(int), + oldType: "int", + oldNullable: true); + + migrationBuilder.AddForeignKey( + name: "FK_Patients_Treatments_TreatmentId", + table: "Patients", + column: "TreatmentId", + principalTable: "Treatments", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + } + } +} diff --git a/Hospital/HospitalDatabaseImplement/Migrations/HospitalDatabaseModelSnapshot.cs b/Hospital/HospitalDatabaseImplement/Migrations/HospitalDatabaseModelSnapshot.cs index 09f3225..20428d0 100644 --- a/Hospital/HospitalDatabaseImplement/Migrations/HospitalDatabaseModelSnapshot.cs +++ b/Hospital/HospitalDatabaseImplement/Migrations/HospitalDatabaseModelSnapshot.cs @@ -98,7 +98,7 @@ namespace HospitalDatabaseImplement.Migrations .IsRequired() .HasColumnType("nvarchar(max)"); - b.Property("TreatmentId") + b.Property("TreatmentId") .HasColumnType("int"); b.HasKey("Id"); @@ -307,8 +307,7 @@ namespace HospitalDatabaseImplement.Migrations b.HasOne("HospitalDatabaseImplement.Models.Treatment", "Treatment") .WithMany("Patients") .HasForeignKey("TreatmentId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + .OnDelete(DeleteBehavior.SetNull); b.Navigation("Treatment"); }); diff --git a/Hospital/HospitalDatabaseImplement/Models/Patient.cs b/Hospital/HospitalDatabaseImplement/Models/Patient.cs index a0f784b..ccfc50d 100644 --- a/Hospital/HospitalDatabaseImplement/Models/Patient.cs +++ b/Hospital/HospitalDatabaseImplement/Models/Patient.cs @@ -1,12 +1,7 @@ using HospitalContracts.BindingModels; using HospitalContracts.ViewModels; using HospitalDataModels.Models; -using System; -using System.Collections.Generic; using System.ComponentModel.DataAnnotations; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using System.Xml.Linq; namespace HospitalDatabaseImplement.Models @@ -23,8 +18,8 @@ namespace HospitalDatabaseImplement.Models [Required] public DateTime BirthDate { get; private set; } - public int TreatmentId { get; private set; } - public virtual Treatment Treatment { get; set; } + public int? TreatmentId { get; private set; } + public virtual Treatment? Treatment { get; set; } public static Patient? Create(PatientBindingModel model) { @@ -55,7 +50,7 @@ namespace HospitalDatabaseImplement.Models Name = element.Element("Name")!.Value, Patronymic = element.Element("Patronymic")?.Value, BirthDate = DateTime.ParseExact(element.Element("BirthDate")!.Value, "dd.mm.yyyy", null), - TreatmentId = Convert.ToInt32(element.Element("TreatmentId")!.Value) + TreatmentId = Convert.ToInt32(element.Element("TreatmentId")?.Value) }; } @@ -80,7 +75,7 @@ namespace HospitalDatabaseImplement.Models Patronymic = Patronymic, BirthDate = BirthDate, TreatmentId = TreatmentId, - TreatmentName = Treatment.Name + TreatmentName = Treatment?.Name }; } }