From 776d62a724c22aa640635be62798dd532f596cc7 Mon Sep 17 00:00:00 2001 From: Francesco Lorenzo D'Amico Date: Fri, 11 Sep 2026 13:29:15 +0200 Subject: [PATCH] Add the PageContent table (entity, DbContext, migration, model snapshot) --- .../Data/RazorPagesMovieContext.cs | 18 ++- .../20260909095802_AddPageContent.Designer.cs | 108 ++++++++++++++++++ .../20260909095802_AddPageContent.cs | 35 ++++++ .../RazorPagesMovieContextModelSnapshot.cs | 19 ++- BewerbungWebseite/Models/PageContentEntity.cs | 19 +++ 5 files changed, 195 insertions(+), 4 deletions(-) create mode 100644 BewerbungWebseite/Migrations/20260909095802_AddPageContent.Designer.cs create mode 100644 BewerbungWebseite/Migrations/20260909095802_AddPageContent.cs create mode 100644 BewerbungWebseite/Models/PageContentEntity.cs diff --git a/BewerbungWebseite/Data/RazorPagesMovieContext.cs b/BewerbungWebseite/Data/RazorPagesMovieContext.cs index ee62fbb..9365760 100644 --- a/BewerbungWebseite/Data/RazorPagesMovieContext.cs +++ b/BewerbungWebseite/Data/RazorPagesMovieContext.cs @@ -1,9 +1,21 @@ using Microsoft.EntityFrameworkCore; +using BewerbungsSeite.Models; namespace BewerbungsSeite.Data; public class RazorPagesMovieContext(DbContextOptions options) : DbContext(options) { - public DbSet AdminUser { get; set; } = default!; - public DbSet ContactMessage { get; set; } = default!; -} \ No newline at end of file + public DbSet AdminUser { get; set; } = default!; + public DbSet ContactMessage { get; set; } = default!; + public DbSet PageContent { get; set; } = default!; + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + base.OnModelCreating(modelBuilder); + + // Es gibt genau eine Zeile mit fester Id, deshalb keine Identity-Spalte. + modelBuilder.Entity() + .Property(p => p.Id) + .ValueGeneratedNever(); + } +} diff --git a/BewerbungWebseite/Migrations/20260909095802_AddPageContent.Designer.cs b/BewerbungWebseite/Migrations/20260909095802_AddPageContent.Designer.cs new file mode 100644 index 0000000..a3145e0 --- /dev/null +++ b/BewerbungWebseite/Migrations/20260909095802_AddPageContent.Designer.cs @@ -0,0 +1,108 @@ +// +using System; +using BewerbungsSeite.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace BewerbungsSeite.Migrations +{ + [DbContext(typeof(RazorPagesMovieContext))] + [Migration("20260909095802_AddPageContent")] + partial class AddPageContent + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.28") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("BewerbungsSeite.Models.AdminUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("PasswordHash") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Username") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.HasKey("Id"); + + b.ToTable("AdminUser"); + }); + + modelBuilder.Entity("BewerbungsSeite.Models.ContactMessage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("Message") + .IsRequired() + .HasMaxLength(5000) + .HasColumnType("nvarchar(max)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("NotificationSent") + .HasColumnType("bit"); + + b.Property("Phone") + .HasMaxLength(30) + .HasColumnType("nvarchar(30)"); + + b.Property("SentAt") + .HasColumnType("datetime2"); + + b.Property("Subject") + .IsRequired() + .HasMaxLength(150) + .HasColumnType("nvarchar(150)"); + + b.HasKey("Id"); + + b.ToTable("ContactMessage"); + }); + + modelBuilder.Entity("BewerbungsSeite.Models.PageContentEntity", b => + { + b.Property("Id") + .HasColumnType("int"); + + b.Property("Content") + .IsRequired() + .HasColumnType("varbinary(max)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime2"); + + b.HasKey("Id"); + + b.ToTable("PageContent"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/BewerbungWebseite/Migrations/20260909095802_AddPageContent.cs b/BewerbungWebseite/Migrations/20260909095802_AddPageContent.cs new file mode 100644 index 0000000..c20931c --- /dev/null +++ b/BewerbungWebseite/Migrations/20260909095802_AddPageContent.cs @@ -0,0 +1,35 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace BewerbungsSeite.Migrations +{ + /// + public partial class AddPageContent : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "PageContent", + columns: table => new + { + Id = table.Column(type: "int", nullable: false), + Content = table.Column(type: "varbinary(max)", nullable: false), + UpdatedAt = table.Column(type: "datetime2", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_PageContent", x => x.Id); + }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "PageContent"); + } + } +} diff --git a/BewerbungWebseite/Migrations/RazorPagesMovieContextModelSnapshot.cs b/BewerbungWebseite/Migrations/RazorPagesMovieContextModelSnapshot.cs index 9b69381..4f543fc 100644 --- a/BewerbungWebseite/Migrations/RazorPagesMovieContextModelSnapshot.cs +++ b/BewerbungWebseite/Migrations/RazorPagesMovieContextModelSnapshot.cs @@ -1,10 +1,10 @@ // using System; +using BewerbungsSeite.Data; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using BewerbungsSeite.Data; #nullable disable @@ -82,6 +82,23 @@ namespace BewerbungsSeite.Migrations b.ToTable("ContactMessage"); }); + + modelBuilder.Entity("BewerbungsSeite.Models.PageContentEntity", b => + { + b.Property("Id") + .HasColumnType("int"); + + b.Property("Content") + .IsRequired() + .HasColumnType("varbinary(max)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime2"); + + b.HasKey("Id"); + + b.ToTable("PageContent"); + }); #pragma warning restore 612, 618 } } diff --git a/BewerbungWebseite/Models/PageContentEntity.cs b/BewerbungWebseite/Models/PageContentEntity.cs new file mode 100644 index 0000000..2b5cd07 --- /dev/null +++ b/BewerbungWebseite/Models/PageContentEntity.cs @@ -0,0 +1,19 @@ +namespace BewerbungsSeite.Models; + +/// +/// Speicherzeile fuer den gesamten Seiteninhalt. Es existiert genau ein +/// Datensatz mit ; der Inhalt liegt serialisiert +/// als UTF-8-JSON im Feld . +/// +public class PageContentEntity +{ + /// Feste Id des einzigen Datensatzes. + public const int SingletonId = 1; + + public int Id { get; set; } + + public byte[] Content { get; set; } = Array.Empty(); + + /// Zeitpunkt der letzten Speicherung (UTC). + public DateTime UpdatedAt { get; set; } +}