Этап 3. Исправлена ошибка с циклическим удалением

This commit is contained in:
prodigygirl 2023-04-06 13:31:20 +04:00
parent ee7b714fc6
commit 96a411f449
6 changed files with 78 additions and 21 deletions

View File

@ -1,5 +1,12 @@
using HospitalDatabaseImplement.Models; using HospitalDatabaseImplement.Models;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using System.Reflection.Metadata;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HospitalDatabaseImplement namespace HospitalDatabaseImplement
{ {
@ -13,6 +20,26 @@ namespace HospitalDatabaseImplement
} }
base.OnConfiguring(optionsBuilder); base.OnConfiguring(optionsBuilder);
} }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// решение проблемы с циклическим удалением - запрет на удаление аптекарей, если они связаны с другими сущностями
modelBuilder
.Entity<Medicine>().HasOne(e => e.Apothecary)
.WithMany(e => e.Medicines)
.OnDelete(DeleteBehavior.Restrict);
modelBuilder
.Entity<Recipe>().HasOne(e => e.Apothecary)
.WithMany(e => e.Recipes)
.OnDelete(DeleteBehavior.Restrict);
modelBuilder
.Entity<Prescription>().HasOne(e => e.Apothecary)
.WithMany(e => e.Prescriptions)
.OnDelete(DeleteBehavior.Restrict);
}
public virtual DbSet<Apothecary> Apothecaries { set; get; } public virtual DbSet<Apothecary> Apothecaries { set; get; }
public virtual DbSet<Recipe> Recipes { set; get; } public virtual DbSet<Recipe> Recipes { set; get; }
public virtual DbSet<Medicine> Medicines { set; get; } public virtual DbSet<Medicine> Medicines { set; get; }

View File

@ -12,8 +12,8 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
namespace HospitalDatabaseImplement.Migrations namespace HospitalDatabaseImplement.Migrations
{ {
[DbContext(typeof(HospitalDatabase))] [DbContext(typeof(HospitalDatabase))]
[Migration("20230405144953_InitialCreate")] [Migration("20230406091825_InitCreate")]
partial class InitialCreate partial class InitCreate
{ {
/// <inheritdoc /> /// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder) protected override void BuildTargetModel(ModelBuilder modelBuilder)
@ -98,6 +98,7 @@ namespace HospitalDatabaseImplement.Migrations
.HasColumnType("nvarchar(max)"); .HasColumnType("nvarchar(max)");
b.Property<string>("Surname") b.Property<string>("Surname")
.IsRequired()
.HasColumnType("nvarchar(max)"); .HasColumnType("nvarchar(max)");
b.Property<int>("TreatmentId") b.Property<int>("TreatmentId")
@ -296,9 +297,9 @@ namespace HospitalDatabaseImplement.Migrations
modelBuilder.Entity("HospitalDatabaseImplement.Models.Medicine", b => modelBuilder.Entity("HospitalDatabaseImplement.Models.Medicine", b =>
{ {
b.HasOne("HospitalDatabaseImplement.Models.Apothecary", "Apothecary") b.HasOne("HospitalDatabaseImplement.Models.Apothecary", "Apothecary")
.WithMany() .WithMany("Medicines")
.HasForeignKey("ApothecaryId") .HasForeignKey("ApothecaryId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Restrict)
.IsRequired(); .IsRequired();
b.Navigation("Apothecary"); b.Navigation("Apothecary");
@ -318,9 +319,9 @@ namespace HospitalDatabaseImplement.Migrations
modelBuilder.Entity("HospitalDatabaseImplement.Models.Prescription", b => modelBuilder.Entity("HospitalDatabaseImplement.Models.Prescription", b =>
{ {
b.HasOne("HospitalDatabaseImplement.Models.Apothecary", "Apothecary") b.HasOne("HospitalDatabaseImplement.Models.Apothecary", "Apothecary")
.WithMany() .WithMany("Prescriptions")
.HasForeignKey("ApothecaryId") .HasForeignKey("ApothecaryId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Restrict)
.IsRequired(); .IsRequired();
b.HasOne("HospitalDatabaseImplement.Models.Medicine", "Medicine") b.HasOne("HospitalDatabaseImplement.Models.Medicine", "Medicine")
@ -356,9 +357,9 @@ namespace HospitalDatabaseImplement.Migrations
modelBuilder.Entity("HospitalDatabaseImplement.Models.Recipe", b => modelBuilder.Entity("HospitalDatabaseImplement.Models.Recipe", b =>
{ {
b.HasOne("HospitalDatabaseImplement.Models.Apothecary", "Apothecary") b.HasOne("HospitalDatabaseImplement.Models.Apothecary", "Apothecary")
.WithMany() .WithMany("Recipes")
.HasForeignKey("ApothecaryId") .HasForeignKey("ApothecaryId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Restrict)
.IsRequired(); .IsRequired();
b.Navigation("Apothecary"); b.Navigation("Apothecary");
@ -421,6 +422,15 @@ namespace HospitalDatabaseImplement.Migrations
b.Navigation("Treatment"); b.Navigation("Treatment");
}); });
modelBuilder.Entity("HospitalDatabaseImplement.Models.Apothecary", b =>
{
b.Navigation("Medicines");
b.Navigation("Prescriptions");
b.Navigation("Recipes");
});
modelBuilder.Entity("HospitalDatabaseImplement.Models.Medicine", b => modelBuilder.Entity("HospitalDatabaseImplement.Models.Medicine", b =>
{ {
b.Navigation("Prescriptions"); b.Navigation("Prescriptions");

View File

@ -6,7 +6,7 @@ using Microsoft.EntityFrameworkCore.Migrations;
namespace HospitalDatabaseImplement.Migrations namespace HospitalDatabaseImplement.Migrations
{ {
/// <inheritdoc /> /// <inheritdoc />
public partial class InitialCreate : Migration public partial class InitCreate : Migration
{ {
/// <inheritdoc /> /// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder) protected override void Up(MigrationBuilder migrationBuilder)
@ -60,7 +60,7 @@ namespace HospitalDatabaseImplement.Migrations
Name = table.Column<string>(type: "nvarchar(60)", maxLength: 60, nullable: false), Name = table.Column<string>(type: "nvarchar(60)", maxLength: 60, nullable: false),
Cost = table.Column<double>(type: "float", nullable: false), Cost = table.Column<double>(type: "float", nullable: false),
Dose = table.Column<string>(type: "nvarchar(10)", maxLength: 10, nullable: false), Dose = table.Column<string>(type: "nvarchar(10)", maxLength: 10, nullable: false),
ApothecaryId = table.Column<int>(type: "int", nullable: false, defaultValue: -1) ApothecaryId = table.Column<int>(type: "int", nullable: false)
}, },
constraints: table => constraints: table =>
{ {
@ -70,7 +70,7 @@ namespace HospitalDatabaseImplement.Migrations
column: x => x.ApothecaryId, column: x => x.ApothecaryId,
principalTable: "Apothecaries", principalTable: "Apothecaries",
principalColumn: "Id", principalColumn: "Id",
onDelete: ReferentialAction.SetDefault); onDelete: ReferentialAction.Restrict);
}); });
migrationBuilder.CreateTable( migrationBuilder.CreateTable(
@ -91,7 +91,7 @@ namespace HospitalDatabaseImplement.Migrations
column: x => x.ApothecaryId, column: x => x.ApothecaryId,
principalTable: "Apothecaries", principalTable: "Apothecaries",
principalColumn: "Id", principalColumn: "Id",
onDelete: ReferentialAction.Cascade); onDelete: ReferentialAction.Restrict);
}); });
migrationBuilder.CreateTable( migrationBuilder.CreateTable(
@ -100,7 +100,7 @@ namespace HospitalDatabaseImplement.Migrations
{ {
Id = table.Column<int>(type: "int", nullable: false) Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"), .Annotation("SqlServer:Identity", "1, 1"),
Surname = table.Column<string>(type: "nvarchar(max)", nullable: true), Surname = table.Column<string>(type: "nvarchar(max)", nullable: false),
Name = table.Column<string>(type: "nvarchar(max)", nullable: false), Name = table.Column<string>(type: "nvarchar(max)", nullable: false),
Patronymic = table.Column<string>(type: "nvarchar(max)", nullable: true), Patronymic = table.Column<string>(type: "nvarchar(max)", nullable: true),
BirthDate = table.Column<DateTime>(type: "datetime2", nullable: false), BirthDate = table.Column<DateTime>(type: "datetime2", nullable: false),
@ -162,7 +162,7 @@ namespace HospitalDatabaseImplement.Migrations
column: x => x.ApothecaryId, column: x => x.ApothecaryId,
principalTable: "Apothecaries", principalTable: "Apothecaries",
principalColumn: "Id", principalColumn: "Id",
onDelete: ReferentialAction.Cascade); onDelete: ReferentialAction.Restrict);
table.ForeignKey( table.ForeignKey(
name: "FK_Prescriptions_Medicines_MedicineId", name: "FK_Prescriptions_Medicines_MedicineId",
column: x => x.MedicineId, column: x => x.MedicineId,

View File

@ -95,6 +95,7 @@ namespace HospitalDatabaseImplement.Migrations
.HasColumnType("nvarchar(max)"); .HasColumnType("nvarchar(max)");
b.Property<string>("Surname") b.Property<string>("Surname")
.IsRequired()
.HasColumnType("nvarchar(max)"); .HasColumnType("nvarchar(max)");
b.Property<int>("TreatmentId") b.Property<int>("TreatmentId")
@ -293,9 +294,9 @@ namespace HospitalDatabaseImplement.Migrations
modelBuilder.Entity("HospitalDatabaseImplement.Models.Medicine", b => modelBuilder.Entity("HospitalDatabaseImplement.Models.Medicine", b =>
{ {
b.HasOne("HospitalDatabaseImplement.Models.Apothecary", "Apothecary") b.HasOne("HospitalDatabaseImplement.Models.Apothecary", "Apothecary")
.WithMany() .WithMany("Medicines")
.HasForeignKey("ApothecaryId") .HasForeignKey("ApothecaryId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Restrict)
.IsRequired(); .IsRequired();
b.Navigation("Apothecary"); b.Navigation("Apothecary");
@ -315,9 +316,9 @@ namespace HospitalDatabaseImplement.Migrations
modelBuilder.Entity("HospitalDatabaseImplement.Models.Prescription", b => modelBuilder.Entity("HospitalDatabaseImplement.Models.Prescription", b =>
{ {
b.HasOne("HospitalDatabaseImplement.Models.Apothecary", "Apothecary") b.HasOne("HospitalDatabaseImplement.Models.Apothecary", "Apothecary")
.WithMany() .WithMany("Prescriptions")
.HasForeignKey("ApothecaryId") .HasForeignKey("ApothecaryId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Restrict)
.IsRequired(); .IsRequired();
b.HasOne("HospitalDatabaseImplement.Models.Medicine", "Medicine") b.HasOne("HospitalDatabaseImplement.Models.Medicine", "Medicine")
@ -353,9 +354,9 @@ namespace HospitalDatabaseImplement.Migrations
modelBuilder.Entity("HospitalDatabaseImplement.Models.Recipe", b => modelBuilder.Entity("HospitalDatabaseImplement.Models.Recipe", b =>
{ {
b.HasOne("HospitalDatabaseImplement.Models.Apothecary", "Apothecary") b.HasOne("HospitalDatabaseImplement.Models.Apothecary", "Apothecary")
.WithMany() .WithMany("Recipes")
.HasForeignKey("ApothecaryId") .HasForeignKey("ApothecaryId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Restrict)
.IsRequired(); .IsRequired();
b.Navigation("Apothecary"); b.Navigation("Apothecary");
@ -418,6 +419,15 @@ namespace HospitalDatabaseImplement.Migrations
b.Navigation("Treatment"); b.Navigation("Treatment");
}); });
modelBuilder.Entity("HospitalDatabaseImplement.Models.Apothecary", b =>
{
b.Navigation("Medicines");
b.Navigation("Prescriptions");
b.Navigation("Recipes");
});
modelBuilder.Entity("HospitalDatabaseImplement.Models.Medicine", b => modelBuilder.Entity("HospitalDatabaseImplement.Models.Medicine", b =>
{ {
b.Navigation("Prescriptions"); b.Navigation("Prescriptions");

View File

@ -2,6 +2,7 @@
using HospitalContracts.ViewModels; using HospitalContracts.ViewModels;
using HospitalDataModels.Models; using HospitalDataModels.Models;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace HospitalDatabaseImplement.Models namespace HospitalDatabaseImplement.Models
{ {
@ -15,6 +16,15 @@ namespace HospitalDatabaseImplement.Models
[MaxLength(55)] [MaxLength(55)]
public string Password { get; private set; } = string.Empty; public string Password { get; private set; } = string.Empty;
[ForeignKey("ApothecaryId")]
public virtual List<Medicine> Medicines { get; set; } = new();
[ForeignKey("ApothecaryId")]
public virtual List<Recipe> Recipes { get; set; } = new();
[ForeignKey("ApothecaryId")]
public virtual List<Prescription> Prescriptions { get; set; } = new();
public static Apothecary? Create(ApothecaryBindingModel model) public static Apothecary? Create(ApothecaryBindingModel model)
{ {
if (model == null) if (model == null)

View File

@ -22,7 +22,7 @@ namespace HospitalDatabaseImplement.Models
public string Dose { get; private set; } = string.Empty; public string Dose { get; private set; } = string.Empty;
[Required] [Required]
public int ApothecaryId { get; private set; } = -1; public int ApothecaryId { get; private set; }
public virtual Apothecary Apothecary { get; set; } public virtual Apothecary Apothecary { get; set; }