diff --git a/SushiBar.sln b/SushiBar.sln index 9456259..ce801dd 100644 --- a/SushiBar.sln +++ b/SushiBar.sln @@ -7,7 +7,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SushiBarView", "SushiBarVie EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SushiBarDataModels", "SushiBarDataModels\SushiBarDataModels.csproj", "{4A5A85B2-9B70-4493-B550-0E29FE82E9FD}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SushiBarDatabaseImplement", "SushiBarDatabaseImplement\SushiBarDatabaseImplement.csproj", "{135C846B-59EC-4803-B07C-8991C60C57D6}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SushiBarDatabaseImplement", "SushiBarDatabaseImplement\SushiBarDatabaseImplement.csproj", "{135C846B-59EC-4803-B07C-8991C60C57D6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SushiBarContracts", "SushiBarContracts\SushiBarContracts.csproj", "{25C0DCD8-6A40-42C5-8459-00F6F085A8C6}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -27,6 +29,10 @@ Global {135C846B-59EC-4803-B07C-8991C60C57D6}.Debug|Any CPU.Build.0 = Debug|Any CPU {135C846B-59EC-4803-B07C-8991C60C57D6}.Release|Any CPU.ActiveCfg = Release|Any CPU {135C846B-59EC-4803-B07C-8991C60C57D6}.Release|Any CPU.Build.0 = Release|Any CPU + {25C0DCD8-6A40-42C5-8459-00F6F085A8C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {25C0DCD8-6A40-42C5-8459-00F6F085A8C6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {25C0DCD8-6A40-42C5-8459-00F6F085A8C6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {25C0DCD8-6A40-42C5-8459-00F6F085A8C6}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/SushiBarContracts/SushiBarContracts.csproj b/SushiBarContracts/SushiBarContracts.csproj new file mode 100644 index 0000000..01dfc5c --- /dev/null +++ b/SushiBarContracts/SushiBarContracts.csproj @@ -0,0 +1,14 @@ + + + + net6.0 + enable + enable + + + + + + + + diff --git a/SushiBarContracts/ViewModels/ChequeItemViewModel.cs b/SushiBarContracts/ViewModels/ChequeItemViewModel.cs new file mode 100644 index 0000000..c39e0d1 --- /dev/null +++ b/SushiBarContracts/ViewModels/ChequeItemViewModel.cs @@ -0,0 +1,22 @@ +using System.ComponentModel; + +namespace SushiBarContracts.ViewModels +{ + public class ChequeItemViewModel + { + public int CheuqueId { get; set; } + + public int DishId { get; set; } + + [DisplayName("Название блюда")] + public string DishName { get; set; } = string.Empty; + + public int CookId { get; set; } + + [DisplayName("Повар")] + public string CookFio { get; set; } = string.Empty; + + [DisplayName("Количество")] + public int Count { get; set; } + } +} diff --git a/SushiBarContracts/ViewModels/ChequeViewModel.cs b/SushiBarContracts/ViewModels/ChequeViewModel.cs new file mode 100644 index 0000000..57db2bb --- /dev/null +++ b/SushiBarContracts/ViewModels/ChequeViewModel.cs @@ -0,0 +1,27 @@ +using System.ComponentModel; + +namespace SushiBarContracts.ViewModels +{ + public class ChequeViewModel + { + public int Id { get; set; } + + public int? CustomerId { get; set; } + + [DisplayName("Покупатель")] + public string? CustomerFio { get; set; } = string.Empty; + + public Dictionary ChequeItems { get; set; } = new(); + + [DisplayName("Дата заказа")] + public DateTime OrderDate { get; set; } + + [DisplayName("Сумма заказа")] + public double TotalSum { get; set; } + + public int? PromotionId { get; set; } + + [DisplayName("Скидка")] + public float? Discount { get; set; } + } +} diff --git a/SushiBarContracts/ViewModels/CookViewModel.cs b/SushiBarContracts/ViewModels/CookViewModel.cs new file mode 100644 index 0000000..bcc6d5a --- /dev/null +++ b/SushiBarContracts/ViewModels/CookViewModel.cs @@ -0,0 +1,15 @@ +using System.ComponentModel; + +namespace SushiBarContracts.ViewModels +{ + public class CookViewModel + { + public int Id { get; set; } + + [DisplayName("Инициалы повара")] + public string Fio { get; set; } = string.Empty; + + [DisplayName("Дата приема на работу")] + public DateTime EmploymentDate { get; set; } + } +} diff --git a/SushiBarContracts/ViewModels/CustomerViewModel.cs b/SushiBarContracts/ViewModels/CustomerViewModel.cs new file mode 100644 index 0000000..4e54205 --- /dev/null +++ b/SushiBarContracts/ViewModels/CustomerViewModel.cs @@ -0,0 +1,18 @@ +using System.ComponentModel; + +namespace SushiBarContracts.ViewModels +{ + public class CustomerViewModel + { + public int Id { get; set; } + + [DisplayName("Инициалы покупателя")] + public string Fio { get; set; } = string.Empty; + + [DisplayName("Дата рождения")] + public DateTime? BirthdayDate { get; set; } + + [DisplayName("Общая сумма всех заказов")] + public double SumOfAllOrders { get; set; } + } +} diff --git a/SushiBarContracts/ViewModels/DishIngredientViewModel.cs b/SushiBarContracts/ViewModels/DishIngredientViewModel.cs new file mode 100644 index 0000000..e2822d1 --- /dev/null +++ b/SushiBarContracts/ViewModels/DishIngredientViewModel.cs @@ -0,0 +1,17 @@ +using System.ComponentModel; + +namespace SushiBarContracts.ViewModels +{ + public class DishIngredientViewModel + { + public int DishId { get; set; } + + public int IngredientId { get; set; } + + [DisplayName("Наименование ингредиента")] + public string IngredientName { get; set; } = string.Empty; + + [DisplayName("Количество")] + public int Count { get; set; } + } +} diff --git a/SushiBarContracts/ViewModels/DishViewModel.cs b/SushiBarContracts/ViewModels/DishViewModel.cs new file mode 100644 index 0000000..cdea94b --- /dev/null +++ b/SushiBarContracts/ViewModels/DishViewModel.cs @@ -0,0 +1,17 @@ +using System.ComponentModel; + +namespace SushiBarContracts.ViewModels +{ + public class DishViewModel + { + public int Id { get; set; } + + [DisplayName("Название блюда")] + public string DishName { get; set; } = string.Empty; + + [DisplayName("Категория")] + public string Category { get; set; } = string.Empty; + + public Dictionary Ingredients { get; set; } = new(); + } +} diff --git a/SushiBarContracts/ViewModels/IngredientViewModel.cs b/SushiBarContracts/ViewModels/IngredientViewModel.cs new file mode 100644 index 0000000..59760fa --- /dev/null +++ b/SushiBarContracts/ViewModels/IngredientViewModel.cs @@ -0,0 +1,18 @@ +using System.ComponentModel; + +namespace SushiBarContracts.ViewModels +{ + public class IngredientViewModel + { + public int Id { get; set; } + + [DisplayName("Наименование ингредиента")] + public string IngredientName { get; set; } = string.Empty; + + [DisplayName("Единицы измерения")] + public string Unit { get; set; } = string.Empty; + + [DisplayName("Стоимость за единицу")] + public double Cost { get; set; } + } +} diff --git a/SushiBarContracts/ViewModels/PromotionViewModel.cs b/SushiBarContracts/ViewModels/PromotionViewModel.cs new file mode 100644 index 0000000..dcf6d80 --- /dev/null +++ b/SushiBarContracts/ViewModels/PromotionViewModel.cs @@ -0,0 +1,18 @@ +using System.ComponentModel; + +namespace SushiBarContracts.ViewModels +{ + public class PromotionViewModel + { + public int Id { get; set; } + + [DisplayName("Название акции")] + public string PromotionName { get; set; } = string.Empty; + + [DisplayName("Размер скидки")] + public float Discount { get; set; } + + [DisplayName("Минимальная сумма для применения")] + public double TriggeringSum { get; set; } + } +} diff --git a/SushiBarDatabaseImplement/Migrations/20240515165005_Initial.Designer.cs b/SushiBarDatabaseImplement/Migrations/20240515165005_Initial.Designer.cs new file mode 100644 index 0000000..51c75a2 --- /dev/null +++ b/SushiBarDatabaseImplement/Migrations/20240515165005_Initial.Designer.cs @@ -0,0 +1,320 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using SushiBarDatabaseImplement; + +#nullable disable + +namespace SushiBarDatabaseImplement.Migrations +{ + [DbContext(typeof(SushiBarDatabase))] + [Migration("20240515165005_Initial")] + partial class Initial + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.19") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.Cheque", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CustomerId") + .HasColumnType("integer"); + + b.Property("OrderDate") + .HasColumnType("timestamp without time zone"); + + b.Property("PromotionId") + .HasColumnType("integer"); + + b.Property("TotalSum") + .HasColumnType("double precision"); + + b.HasKey("Id"); + + b.HasIndex("CustomerId"); + + b.HasIndex("PromotionId"); + + b.ToTable("Cheques"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.ChequeItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChequeId") + .HasColumnType("integer"); + + b.Property("CookId") + .HasColumnType("integer"); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("DishId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ChequeId"); + + b.HasIndex("CookId"); + + b.HasIndex("DishId"); + + b.ToTable("ChequeItems"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.Cook", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("EmploymentDate") + .HasColumnType("timestamp without time zone"); + + b.Property("Fio") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Cooks"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.Customer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BirthdayDate") + .HasColumnType("timestamp without time zone"); + + b.Property("Fio") + .IsRequired() + .HasColumnType("text"); + + b.Property("SumOfAllOrders") + .HasColumnType("double precision"); + + b.HasKey("Id"); + + b.ToTable("Customers"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.Dish", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Category") + .IsRequired() + .HasColumnType("text"); + + b.Property("DishName") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Dishes"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.DishIngredient", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("DishId") + .HasColumnType("integer"); + + b.Property("IngredientId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("DishId"); + + b.HasIndex("IngredientId"); + + b.ToTable("DishIngredients"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.Ingredient", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Cost") + .HasColumnType("double precision"); + + b.Property("IngredientName") + .IsRequired() + .HasColumnType("text"); + + b.Property("Unit") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Ingredients"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.Promotion", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Discount") + .HasColumnType("real"); + + b.Property("PromotionName") + .IsRequired() + .HasColumnType("text"); + + b.Property("TriggeringSum") + .HasColumnType("double precision"); + + b.HasKey("Id"); + + b.ToTable("Promotions"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.Cheque", b => + { + b.HasOne("SushiBarDatabaseImplement.Models.Customer", "Customer") + .WithMany("Cheques") + .HasForeignKey("CustomerId"); + + b.HasOne("SushiBarDatabaseImplement.Models.Promotion", "Promotion") + .WithMany("Cheques") + .HasForeignKey("PromotionId"); + + b.Navigation("Customer"); + + b.Navigation("Promotion"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.ChequeItem", b => + { + b.HasOne("SushiBarDatabaseImplement.Models.Cheque", "Cheque") + .WithMany("ChequeItems") + .HasForeignKey("ChequeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("SushiBarDatabaseImplement.Models.Cook", "Cook") + .WithMany("ChequeItems") + .HasForeignKey("CookId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("SushiBarDatabaseImplement.Models.Dish", "Dish") + .WithMany("ChequeItems") + .HasForeignKey("DishId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Cheque"); + + b.Navigation("Cook"); + + b.Navigation("Dish"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.DishIngredient", b => + { + b.HasOne("SushiBarDatabaseImplement.Models.Dish", "Dish") + .WithMany("DishIngredients") + .HasForeignKey("DishId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("SushiBarDatabaseImplement.Models.Ingredient", "Ingredient") + .WithMany("DishIngredients") + .HasForeignKey("IngredientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Dish"); + + b.Navigation("Ingredient"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.Cheque", b => + { + b.Navigation("ChequeItems"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.Cook", b => + { + b.Navigation("ChequeItems"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.Customer", b => + { + b.Navigation("Cheques"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.Dish", b => + { + b.Navigation("ChequeItems"); + + b.Navigation("DishIngredients"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.Ingredient", b => + { + b.Navigation("DishIngredients"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.Promotion", b => + { + b.Navigation("Cheques"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/SushiBarDatabaseImplement/Migrations/20240515165005_Initial.cs b/SushiBarDatabaseImplement/Migrations/20240515165005_Initial.cs new file mode 100644 index 0000000..a6ba372 --- /dev/null +++ b/SushiBarDatabaseImplement/Migrations/20240515165005_Initial.cs @@ -0,0 +1,239 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace SushiBarDatabaseImplement.Migrations +{ + /// + public partial class Initial : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Cooks", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Fio = table.Column(type: "text", nullable: false), + EmploymentDate = table.Column(type: "timestamp without time zone", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Cooks", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Customers", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Fio = table.Column(type: "text", nullable: false), + BirthdayDate = table.Column(type: "timestamp without time zone", nullable: false), + SumOfAllOrders = table.Column(type: "double precision", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Customers", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Dishes", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + DishName = table.Column(type: "text", nullable: false), + Category = table.Column(type: "text", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Dishes", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Ingredients", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + IngredientName = table.Column(type: "text", nullable: false), + Unit = table.Column(type: "text", nullable: false), + Cost = table.Column(type: "double precision", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Ingredients", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Promotions", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + PromotionName = table.Column(type: "text", nullable: false), + Discount = table.Column(type: "real", nullable: false), + TriggeringSum = table.Column(type: "double precision", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Promotions", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "DishIngredients", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + DishId = table.Column(type: "integer", nullable: false), + IngredientId = table.Column(type: "integer", nullable: false), + Count = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_DishIngredients", x => x.Id); + table.ForeignKey( + name: "FK_DishIngredients_Dishes_DishId", + column: x => x.DishId, + principalTable: "Dishes", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_DishIngredients_Ingredients_IngredientId", + column: x => x.IngredientId, + principalTable: "Ingredients", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Cheques", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + CustomerId = table.Column(type: "integer", nullable: true), + OrderDate = table.Column(type: "timestamp without time zone", nullable: false), + TotalSum = table.Column(type: "double precision", nullable: false), + PromotionId = table.Column(type: "integer", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Cheques", x => x.Id); + table.ForeignKey( + name: "FK_Cheques_Customers_CustomerId", + column: x => x.CustomerId, + principalTable: "Customers", + principalColumn: "Id"); + table.ForeignKey( + name: "FK_Cheques_Promotions_PromotionId", + column: x => x.PromotionId, + principalTable: "Promotions", + principalColumn: "Id"); + }); + + migrationBuilder.CreateTable( + name: "ChequeItems", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + ChequeId = table.Column(type: "integer", nullable: false), + DishId = table.Column(type: "integer", nullable: false), + CookId = table.Column(type: "integer", nullable: false), + Count = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_ChequeItems", x => x.Id); + table.ForeignKey( + name: "FK_ChequeItems_Cheques_ChequeId", + column: x => x.ChequeId, + principalTable: "Cheques", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_ChequeItems_Cooks_CookId", + column: x => x.CookId, + principalTable: "Cooks", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_ChequeItems_Dishes_DishId", + column: x => x.DishId, + principalTable: "Dishes", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_ChequeItems_ChequeId", + table: "ChequeItems", + column: "ChequeId"); + + migrationBuilder.CreateIndex( + name: "IX_ChequeItems_CookId", + table: "ChequeItems", + column: "CookId"); + + migrationBuilder.CreateIndex( + name: "IX_ChequeItems_DishId", + table: "ChequeItems", + column: "DishId"); + + migrationBuilder.CreateIndex( + name: "IX_Cheques_CustomerId", + table: "Cheques", + column: "CustomerId"); + + migrationBuilder.CreateIndex( + name: "IX_Cheques_PromotionId", + table: "Cheques", + column: "PromotionId"); + + migrationBuilder.CreateIndex( + name: "IX_DishIngredients_DishId", + table: "DishIngredients", + column: "DishId"); + + migrationBuilder.CreateIndex( + name: "IX_DishIngredients_IngredientId", + table: "DishIngredients", + column: "IngredientId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "ChequeItems"); + + migrationBuilder.DropTable( + name: "DishIngredients"); + + migrationBuilder.DropTable( + name: "Cheques"); + + migrationBuilder.DropTable( + name: "Cooks"); + + migrationBuilder.DropTable( + name: "Dishes"); + + migrationBuilder.DropTable( + name: "Ingredients"); + + migrationBuilder.DropTable( + name: "Customers"); + + migrationBuilder.DropTable( + name: "Promotions"); + } + } +} diff --git a/SushiBarDatabaseImplement/Migrations/SushiBarDatabaseModelSnapshot.cs b/SushiBarDatabaseImplement/Migrations/SushiBarDatabaseModelSnapshot.cs new file mode 100644 index 0000000..d3f1fa3 --- /dev/null +++ b/SushiBarDatabaseImplement/Migrations/SushiBarDatabaseModelSnapshot.cs @@ -0,0 +1,317 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using SushiBarDatabaseImplement; + +#nullable disable + +namespace SushiBarDatabaseImplement.Migrations +{ + [DbContext(typeof(SushiBarDatabase))] + partial class SushiBarDatabaseModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.19") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.Cheque", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CustomerId") + .HasColumnType("integer"); + + b.Property("OrderDate") + .HasColumnType("timestamp without time zone"); + + b.Property("PromotionId") + .HasColumnType("integer"); + + b.Property("TotalSum") + .HasColumnType("double precision"); + + b.HasKey("Id"); + + b.HasIndex("CustomerId"); + + b.HasIndex("PromotionId"); + + b.ToTable("Cheques"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.ChequeItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChequeId") + .HasColumnType("integer"); + + b.Property("CookId") + .HasColumnType("integer"); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("DishId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ChequeId"); + + b.HasIndex("CookId"); + + b.HasIndex("DishId"); + + b.ToTable("ChequeItems"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.Cook", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("EmploymentDate") + .HasColumnType("timestamp without time zone"); + + b.Property("Fio") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Cooks"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.Customer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BirthdayDate") + .HasColumnType("timestamp without time zone"); + + b.Property("Fio") + .IsRequired() + .HasColumnType("text"); + + b.Property("SumOfAllOrders") + .HasColumnType("double precision"); + + b.HasKey("Id"); + + b.ToTable("Customers"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.Dish", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Category") + .IsRequired() + .HasColumnType("text"); + + b.Property("DishName") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Dishes"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.DishIngredient", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("DishId") + .HasColumnType("integer"); + + b.Property("IngredientId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("DishId"); + + b.HasIndex("IngredientId"); + + b.ToTable("DishIngredients"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.Ingredient", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Cost") + .HasColumnType("double precision"); + + b.Property("IngredientName") + .IsRequired() + .HasColumnType("text"); + + b.Property("Unit") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Ingredients"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.Promotion", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Discount") + .HasColumnType("real"); + + b.Property("PromotionName") + .IsRequired() + .HasColumnType("text"); + + b.Property("TriggeringSum") + .HasColumnType("double precision"); + + b.HasKey("Id"); + + b.ToTable("Promotions"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.Cheque", b => + { + b.HasOne("SushiBarDatabaseImplement.Models.Customer", "Customer") + .WithMany("Cheques") + .HasForeignKey("CustomerId"); + + b.HasOne("SushiBarDatabaseImplement.Models.Promotion", "Promotion") + .WithMany("Cheques") + .HasForeignKey("PromotionId"); + + b.Navigation("Customer"); + + b.Navigation("Promotion"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.ChequeItem", b => + { + b.HasOne("SushiBarDatabaseImplement.Models.Cheque", "Cheque") + .WithMany("ChequeItems") + .HasForeignKey("ChequeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("SushiBarDatabaseImplement.Models.Cook", "Cook") + .WithMany("ChequeItems") + .HasForeignKey("CookId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("SushiBarDatabaseImplement.Models.Dish", "Dish") + .WithMany("ChequeItems") + .HasForeignKey("DishId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Cheque"); + + b.Navigation("Cook"); + + b.Navigation("Dish"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.DishIngredient", b => + { + b.HasOne("SushiBarDatabaseImplement.Models.Dish", "Dish") + .WithMany("DishIngredients") + .HasForeignKey("DishId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("SushiBarDatabaseImplement.Models.Ingredient", "Ingredient") + .WithMany("DishIngredients") + .HasForeignKey("IngredientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Dish"); + + b.Navigation("Ingredient"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.Cheque", b => + { + b.Navigation("ChequeItems"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.Cook", b => + { + b.Navigation("ChequeItems"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.Customer", b => + { + b.Navigation("Cheques"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.Dish", b => + { + b.Navigation("ChequeItems"); + + b.Navigation("DishIngredients"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.Ingredient", b => + { + b.Navigation("DishIngredients"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.Promotion", b => + { + b.Navigation("Cheques"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/SushiBarDatabaseImplement/Models/Cheque.cs b/SushiBarDatabaseImplement/Models/Cheque.cs index f12ceee..738309f 100644 --- a/SushiBarDatabaseImplement/Models/Cheque.cs +++ b/SushiBarDatabaseImplement/Models/Cheque.cs @@ -22,7 +22,7 @@ namespace SushiBarDatabaseImplement.Models public virtual Promotion? Promotion { get; set; } - [ForeignKey("Cheque")] - public List ChequeItems { get; set; } = new(); + [ForeignKey("ChequeId")] + public virtual List ChequeItems { get; set; } = new(); } } diff --git a/SushiBarDatabaseImplement/Models/Cook.cs b/SushiBarDatabaseImplement/Models/Cook.cs index d02e8f7..bd662d2 100644 --- a/SushiBarDatabaseImplement/Models/Cook.cs +++ b/SushiBarDatabaseImplement/Models/Cook.cs @@ -15,6 +15,6 @@ namespace SushiBarDatabaseImplement.Models public DateTime EmploymentDate { get; set; } [ForeignKey("CookId")] - public List ChequeItems { get; set; } = new(); + public virtual List ChequeItems { get; set; } = new(); } } diff --git a/SushiBarDatabaseImplement/Models/Customer.cs b/SushiBarDatabaseImplement/Models/Customer.cs index 2f38f86..0109d4c 100644 --- a/SushiBarDatabaseImplement/Models/Customer.cs +++ b/SushiBarDatabaseImplement/Models/Customer.cs @@ -18,6 +18,6 @@ namespace SushiBarDatabaseImplement.Models public double SumOfAllOrders { get; set; } [ForeignKey("CustomerId")] - public List Cheques { get; set; } = new(); + public virtual List Cheques { get; set; } = new(); } } diff --git a/SushiBarDatabaseImplement/Models/Dish.cs b/SushiBarDatabaseImplement/Models/Dish.cs index e074a0c..2f277d7 100644 --- a/SushiBarDatabaseImplement/Models/Dish.cs +++ b/SushiBarDatabaseImplement/Models/Dish.cs @@ -18,6 +18,6 @@ namespace SushiBarDatabaseImplement.Models public virtual List DishIngredients { get; set; } = new(); [ForeignKey("DishId")] - public List ChequeItems { get; set; } = new(); + public virtual List ChequeItems { get; set; } = new(); } } diff --git a/SushiBarDatabaseImplement/Models/Promotion.cs b/SushiBarDatabaseImplement/Models/Promotion.cs index d70bdae..c198c53 100644 --- a/SushiBarDatabaseImplement/Models/Promotion.cs +++ b/SushiBarDatabaseImplement/Models/Promotion.cs @@ -18,6 +18,6 @@ namespace SushiBarDatabaseImplement.Models public double TriggeringSum { get; set; } [ForeignKey("PromotionId")] - public List Cheques { get; set; } = new(); + public virtual List Cheques { get; set; } = new(); } } diff --git a/SushiBarDatabaseImplement/Storages/IngredientStorage.cs b/SushiBarDatabaseImplement/Storages/IngredientStorage.cs new file mode 100644 index 0000000..f9e9112 --- /dev/null +++ b/SushiBarDatabaseImplement/Storages/IngredientStorage.cs @@ -0,0 +1,7 @@ +namespace SushiBarDatabaseImplement.Storages +{ + public class IngredientStorage + { + public List<> + } +} diff --git a/SushiBarDatabaseImplement/SushiBarDatabaseImplement.csproj b/SushiBarDatabaseImplement/SushiBarDatabaseImplement.csproj index 12c5ac5..ca3e10d 100644 --- a/SushiBarDatabaseImplement/SushiBarDatabaseImplement.csproj +++ b/SushiBarDatabaseImplement/SushiBarDatabaseImplement.csproj @@ -12,7 +12,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/SushiBarView/SushiBarView.csproj b/SushiBarView/SushiBarView.csproj index b57c89e..c3d2ab9 100644 --- a/SushiBarView/SushiBarView.csproj +++ b/SushiBarView/SushiBarView.csproj @@ -8,4 +8,15 @@ enable + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + \ No newline at end of file