diff --git a/CutList.Web/Data/ApplicationDbContext.cs b/CutList.Web/Data/ApplicationDbContext.cs index f3f260a..01b850d 100644 --- a/CutList.Web/Data/ApplicationDbContext.cs +++ b/CutList.Web/Data/ApplicationDbContext.cs @@ -11,12 +11,12 @@ public class ApplicationDbContext : DbContext } public DbSet Materials => Set(); + public DbSet MaterialStockLengths => Set(); public DbSet Suppliers => Set(); public DbSet SupplierStocks => Set(); public DbSet CuttingTools => Set(); public DbSet Projects => Set(); public DbSet ProjectParts => Set(); - public DbSet ProjectStockBins => Set(); protected override void OnModelCreating(ModelBuilder modelBuilder) { @@ -32,6 +32,21 @@ public class ApplicationDbContext : DbContext entity.Property(e => e.CreatedAt).HasDefaultValueSql("GETUTCDATE()"); }); + // MaterialStockLength + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id); + entity.Property(e => e.LengthInches).HasPrecision(10, 4); + entity.Property(e => e.Notes).HasMaxLength(255); + + entity.HasOne(e => e.Material) + .WithMany(m => m.StockLengths) + .HasForeignKey(e => e.MaterialId) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasIndex(e => new { e.MaterialId, e.LengthInches }).IsUnique(); + }); + // Supplier modelBuilder.Entity(entity => { @@ -75,13 +90,9 @@ public class ApplicationDbContext : DbContext { entity.HasKey(e => e.Id); entity.Property(e => e.Name).HasMaxLength(100).IsRequired(); + entity.Property(e => e.Customer).HasMaxLength(100); entity.Property(e => e.CreatedAt).HasDefaultValueSql("GETUTCDATE()"); - entity.HasOne(e => e.Material) - .WithMany(m => m.Projects) - .HasForeignKey(e => e.MaterialId) - .OnDelete(DeleteBehavior.SetNull); - entity.HasOne(e => e.CuttingTool) .WithMany(t => t.Projects) .HasForeignKey(e => e.CuttingToolId) @@ -92,25 +103,18 @@ public class ApplicationDbContext : DbContext modelBuilder.Entity(entity => { entity.HasKey(e => e.Id); - entity.Property(e => e.Name).HasMaxLength(100).IsRequired(); + entity.Property(e => e.Name).HasMaxLength(100); entity.Property(e => e.LengthInches).HasPrecision(10, 4); entity.HasOne(e => e.Project) .WithMany(p => p.Parts) .HasForeignKey(e => e.ProjectId) .OnDelete(DeleteBehavior.Cascade); - }); - // ProjectStockBin - modelBuilder.Entity(entity => - { - entity.HasKey(e => e.Id); - entity.Property(e => e.LengthInches).HasPrecision(10, 4); - - entity.HasOne(e => e.Project) - .WithMany(p => p.StockBins) - .HasForeignKey(e => e.ProjectId) - .OnDelete(DeleteBehavior.Cascade); + entity.HasOne(e => e.Material) + .WithMany(m => m.ProjectParts) + .HasForeignKey(e => e.MaterialId) + .OnDelete(DeleteBehavior.Restrict); }); // Seed default cutting tools diff --git a/CutList.Web/Migrations/ApplicationDbContextModelSnapshot.cs b/CutList.Web/Migrations/ApplicationDbContextModelSnapshot.cs index 3b08fe0..6caf264 100644 --- a/CutList.Web/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/CutList.Web/Migrations/ApplicationDbContextModelSnapshot.cs @@ -122,6 +122,39 @@ namespace CutList.Web.Migrations b.ToTable("Materials"); }); + modelBuilder.Entity("CutList.Web.Data.Entities.MaterialStockLength", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("IsActive") + .HasColumnType("bit"); + + b.Property("LengthInches") + .HasPrecision(10, 4) + .HasColumnType("decimal(10,4)"); + + b.Property("MaterialId") + .HasColumnType("int"); + + b.Property("Notes") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Quantity") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("MaterialId", "LengthInches") + .IsUnique(); + + b.ToTable("MaterialStockLengths"); + }); + modelBuilder.Entity("CutList.Web.Data.Entities.Project", b => { b.Property("Id") @@ -135,10 +168,11 @@ namespace CutList.Web.Migrations .HasColumnType("datetime2") .HasDefaultValueSql("GETUTCDATE()"); - b.Property("CuttingToolId") - .HasColumnType("int"); + b.Property("Customer") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); - b.Property("MaterialId") + b.Property("CuttingToolId") .HasColumnType("int"); b.Property("Name") @@ -156,8 +190,6 @@ namespace CutList.Web.Migrations b.HasIndex("CuttingToolId"); - b.HasIndex("MaterialId"); - b.ToTable("Projects"); }); @@ -173,6 +205,9 @@ namespace CutList.Web.Migrations .HasPrecision(10, 4) .HasColumnType("decimal(10,4)"); + b.Property("MaterialId") + .HasColumnType("int"); + b.Property("Name") .IsRequired() .HasMaxLength(100) @@ -189,42 +224,13 @@ namespace CutList.Web.Migrations b.HasKey("Id"); + b.HasIndex("MaterialId"); + b.HasIndex("ProjectId"); b.ToTable("ProjectParts"); }); - modelBuilder.Entity("CutList.Web.Data.Entities.ProjectStockBin", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("LengthInches") - .HasPrecision(10, 4) - .HasColumnType("decimal(10,4)"); - - b.Property("Priority") - .HasColumnType("int"); - - b.Property("ProjectId") - .HasColumnType("int"); - - b.Property("Quantity") - .HasColumnType("int"); - - b.Property("SortOrder") - .HasColumnType("int"); - - b.HasKey("Id"); - - b.HasIndex("ProjectId"); - - b.ToTable("ProjectStockBins"); - }); - modelBuilder.Entity("CutList.Web.Data.Entities.Supplier", b => { b.Property("Id") @@ -297,6 +303,17 @@ namespace CutList.Web.Migrations b.ToTable("SupplierStocks"); }); + modelBuilder.Entity("CutList.Web.Data.Entities.MaterialStockLength", b => + { + b.HasOne("CutList.Web.Data.Entities.Material", "Material") + .WithMany("StockLengths") + .HasForeignKey("MaterialId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Material"); + }); + modelBuilder.Entity("CutList.Web.Data.Entities.Project", b => { b.HasOne("CutList.Web.Data.Entities.CuttingTool", "CuttingTool") @@ -304,34 +321,24 @@ namespace CutList.Web.Migrations .HasForeignKey("CuttingToolId") .OnDelete(DeleteBehavior.SetNull); - b.HasOne("CutList.Web.Data.Entities.Material", "Material") - .WithMany("Projects") - .HasForeignKey("MaterialId") - .OnDelete(DeleteBehavior.SetNull); - b.Navigation("CuttingTool"); - - b.Navigation("Material"); }); modelBuilder.Entity("CutList.Web.Data.Entities.ProjectPart", b => { + b.HasOne("CutList.Web.Data.Entities.Material", "Material") + .WithMany("ProjectParts") + .HasForeignKey("MaterialId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + b.HasOne("CutList.Web.Data.Entities.Project", "Project") .WithMany("Parts") .HasForeignKey("ProjectId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.Navigation("Project"); - }); - - modelBuilder.Entity("CutList.Web.Data.Entities.ProjectStockBin", b => - { - b.HasOne("CutList.Web.Data.Entities.Project", "Project") - .WithMany("StockBins") - .HasForeignKey("ProjectId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + b.Navigation("Material"); b.Navigation("Project"); }); @@ -362,7 +369,9 @@ namespace CutList.Web.Migrations modelBuilder.Entity("CutList.Web.Data.Entities.Material", b => { - b.Navigation("Projects"); + b.Navigation("ProjectParts"); + + b.Navigation("StockLengths"); b.Navigation("SupplierStocks"); }); @@ -370,8 +379,6 @@ namespace CutList.Web.Migrations modelBuilder.Entity("CutList.Web.Data.Entities.Project", b => { b.Navigation("Parts"); - - b.Navigation("StockBins"); }); modelBuilder.Entity("CutList.Web.Data.Entities.Supplier", b =>