From c30e503642a6b71de4257dbb1fa44cfd17418c15 Mon Sep 17 00:00:00 2001 From: max Date: Tue, 2 Sep 2025 15:37:28 +0200 Subject: [PATCH] [DB] Update initial db --- Manager.Data/Contexts/LibraryDbContext.cs | 13 +++- .../Entities/LibraryContext/ChannelEntity.cs | 3 + .../LibraryContext/ClientAccountEntity.cs | 3 - ...20250902133345_InitialLibrary.Designer.cs} | 40 ++++++++-- ...ib.cs => 20250902133345_InitialLibrary.cs} | 73 ++++++++++++------- .../LibraryDbContextModelSnapshot.cs | 36 +++++++-- README.md | 5 +- 7 files changed, 125 insertions(+), 48 deletions(-) rename Manager.Data/Migrations/{20250831150411_initialLib.Designer.cs => 20250902133345_InitialLibrary.Designer.cs} (91%) rename Manager.Data/Migrations/{20250831150411_initialLib.cs => 20250902133345_InitialLibrary.cs} (91%) diff --git a/Manager.Data/Contexts/LibraryDbContext.cs b/Manager.Data/Contexts/LibraryDbContext.cs index 26b65c5..8ab772b 100644 --- a/Manager.Data/Contexts/LibraryDbContext.cs +++ b/Manager.Data/Contexts/LibraryDbContext.cs @@ -32,16 +32,21 @@ public sealed class LibraryDbContext : DbContext { channel.ToTable("channels"); channel.HasKey(x => x.Id); - //TODO: Link media from channel + channel.HasMany(x => x.Media) + .WithOne() + .HasForeignKey(x => x.ChannelId); + channel.HasMany(x => x.Playlists) + .WithOne() + .HasForeignKey(x => x.ChannelId); + channel.HasOne(x => x.ClientAccount) + .WithOne() + .HasForeignKey(e => e.Id); }); modelBuilder.Entity(cae => { cae.ToTable("client_accounts"); cae.HasKey(x => x.Id); - cae.HasMany(x => x.Playlists) - .WithOne() - .HasForeignKey(x => x.ChannelId); cae.HasMany(x => x.HttpCookies) .WithOne() .HasForeignKey(x => x.ClientId); diff --git a/Manager.Data/Entities/LibraryContext/ChannelEntity.cs b/Manager.Data/Entities/LibraryContext/ChannelEntity.cs index 92f7df9..eedceca 100644 --- a/Manager.Data/Entities/LibraryContext/ChannelEntity.cs +++ b/Manager.Data/Entities/LibraryContext/ChannelEntity.cs @@ -14,4 +14,7 @@ public class ChannelEntity : DateTimeBase public long Subscribers { get; set; } public long TotalVideos { get; set; } public long TotalViews { get; set; } + public List Media { get; set; } = []; + public List Playlists { get; set; } = []; + public ClientAccountEntity? ClientAccount { get; set; } } \ No newline at end of file diff --git a/Manager.Data/Entities/LibraryContext/ClientAccountEntity.cs b/Manager.Data/Entities/LibraryContext/ClientAccountEntity.cs index 300804c..154c4d0 100644 --- a/Manager.Data/Entities/LibraryContext/ClientAccountEntity.cs +++ b/Manager.Data/Entities/LibraryContext/ClientAccountEntity.cs @@ -6,9 +6,6 @@ public class ClientAccountEntity : DateTimeBase { [MaxLength(DataConstants.DbContext.DefaultDbStringSize)] public required string Id { get; set; } - [MaxLength(DataConstants.DbContext.DefaultDbStringSize)] - public string Name { get; set; } = ""; - public List Playlists { get; set; } = []; public List HttpCookies { get; set; } = []; [MaxLength(DataConstants.DbContext.DefaultDbStringSize)] public string? UserAgent { get; set; } diff --git a/Manager.Data/Migrations/20250831150411_initialLib.Designer.cs b/Manager.Data/Migrations/20250902133345_InitialLibrary.Designer.cs similarity index 91% rename from Manager.Data/Migrations/20250831150411_initialLib.Designer.cs rename to Manager.Data/Migrations/20250902133345_InitialLibrary.Designer.cs index 2ac6751..e24e45d 100644 --- a/Manager.Data/Migrations/20250831150411_initialLib.Designer.cs +++ b/Manager.Data/Migrations/20250902133345_InitialLibrary.Designer.cs @@ -11,8 +11,8 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace Manager.Data.Migrations { [DbContext(typeof(LibraryDbContext))] - [Migration("20250831150411_initialLib")] - partial class initialLib + [Migration("20250902133345_InitialLibrary")] + partial class InitialLibrary { /// protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -89,8 +89,7 @@ namespace Manager.Data.Migrations b.Property("LastModifiedUtc") .HasColumnType("TEXT"); - b.Property("Name") - .IsRequired() + b.Property("UserAgent") .HasMaxLength(100) .HasColumnType("TEXT"); @@ -210,6 +209,8 @@ namespace Manager.Data.Migrations b.HasKey("Id"); + b.HasIndex("ChannelId"); + b.ToTable("media", (string)null); }); @@ -318,6 +319,15 @@ namespace Manager.Data.Migrations .IsRequired(); }); + modelBuilder.Entity("Manager.Data.Entities.LibraryContext.ClientAccountEntity", b => + { + b.HasOne("Manager.Data.Entities.LibraryContext.ChannelEntity", null) + .WithOne("ClientAccount") + .HasForeignKey("Manager.Data.Entities.LibraryContext.ClientAccountEntity", "Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("Manager.Data.Entities.LibraryContext.HttpCookieEntity", b => { b.HasOne("Manager.Data.Entities.LibraryContext.ClientAccountEntity", null) @@ -342,6 +352,15 @@ namespace Manager.Data.Migrations .IsRequired(); }); + modelBuilder.Entity("Manager.Data.Entities.LibraryContext.MediaEntity", b => + { + b.HasOne("Manager.Data.Entities.LibraryContext.ChannelEntity", null) + .WithMany("Media") + .HasForeignKey("ChannelId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("Manager.Data.Entities.LibraryContext.MediaFormatEntity", b => { b.HasOne("Manager.Data.Entities.LibraryContext.MediaEntity", null) @@ -353,18 +372,25 @@ namespace Manager.Data.Migrations modelBuilder.Entity("Manager.Data.Entities.LibraryContext.PlaylistEntity", b => { - b.HasOne("Manager.Data.Entities.LibraryContext.ClientAccountEntity", null) + b.HasOne("Manager.Data.Entities.LibraryContext.ChannelEntity", null) .WithMany("Playlists") .HasForeignKey("ChannelId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); + modelBuilder.Entity("Manager.Data.Entities.LibraryContext.ChannelEntity", b => + { + b.Navigation("ClientAccount"); + + b.Navigation("Media"); + + b.Navigation("Playlists"); + }); + modelBuilder.Entity("Manager.Data.Entities.LibraryContext.ClientAccountEntity", b => { b.Navigation("HttpCookies"); - - b.Navigation("Playlists"); }); modelBuilder.Entity("Manager.Data.Entities.LibraryContext.MediaEntity", b => diff --git a/Manager.Data/Migrations/20250831150411_initialLib.cs b/Manager.Data/Migrations/20250902133345_InitialLibrary.cs similarity index 91% rename from Manager.Data/Migrations/20250831150411_initialLib.cs rename to Manager.Data/Migrations/20250902133345_InitialLibrary.cs index 631dd91..ca8be1b 100644 --- a/Manager.Data/Migrations/20250831150411_initialLib.cs +++ b/Manager.Data/Migrations/20250902133345_InitialLibrary.cs @@ -6,7 +6,7 @@ using Microsoft.EntityFrameworkCore.Migrations; namespace Manager.Data.Migrations { /// - public partial class initialLib : Migration + public partial class InitialLibrary : Migration { /// protected override void Up(MigrationBuilder migrationBuilder) @@ -35,13 +35,19 @@ namespace Manager.Data.Migrations columns: table => new { Id = table.Column(type: "TEXT", maxLength: 100, nullable: false), - Name = table.Column(type: "TEXT", maxLength: 100, nullable: false), + UserAgent = table.Column(type: "TEXT", maxLength: 100, nullable: true), CreatedAtUtc = table.Column(type: "TEXT", nullable: false), LastModifiedUtc = table.Column(type: "TEXT", nullable: false) }, constraints: table => { table.PrimaryKey("PK_client_accounts", x => x.Id); + table.ForeignKey( + name: "FK_client_accounts_channels_Id", + column: x => x.Id, + principalTable: "channels", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( @@ -62,6 +68,34 @@ namespace Manager.Data.Migrations constraints: table => { table.PrimaryKey("PK_media", x => x.Id); + table.ForeignKey( + name: "FK_media_channels_ChannelId", + column: x => x.ChannelId, + principalTable: "channels", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "playlists", + columns: table => new + { + Id = table.Column(type: "TEXT", maxLength: 100, nullable: false), + Name = table.Column(type: "TEXT", maxLength: 100, nullable: false), + Description = table.Column(type: "TEXT", maxLength: 500, nullable: true), + ChannelId = table.Column(type: "TEXT", maxLength: 100, nullable: false), + CreatedAtUtc = table.Column(type: "TEXT", nullable: false), + LastModifiedUtc = table.Column(type: "TEXT", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_playlists", x => x.Id); + table.ForeignKey( + name: "FK_playlists_channels_ChannelId", + column: x => x.ChannelId, + principalTable: "channels", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( @@ -91,28 +125,6 @@ namespace Manager.Data.Migrations onDelete: ReferentialAction.Cascade); }); - migrationBuilder.CreateTable( - name: "playlists", - columns: table => new - { - Id = table.Column(type: "TEXT", maxLength: 100, nullable: false), - Name = table.Column(type: "TEXT", maxLength: 100, nullable: false), - Description = table.Column(type: "TEXT", maxLength: 500, nullable: true), - ChannelId = table.Column(type: "TEXT", maxLength: 100, nullable: false), - CreatedAtUtc = table.Column(type: "TEXT", nullable: false), - LastModifiedUtc = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_playlists", x => x.Id); - table.ForeignKey( - name: "FK_playlists_client_accounts_ChannelId", - column: x => x.ChannelId, - principalTable: "client_accounts", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - migrationBuilder.CreateTable( name: "captions", columns: table => new @@ -201,6 +213,11 @@ namespace Manager.Data.Migrations table: "join_playlist_media", column: "MediaId"); + migrationBuilder.CreateIndex( + name: "IX_media_ChannelId", + table: "media", + column: "ChannelId"); + migrationBuilder.CreateIndex( name: "IX_playlists_ChannelId", table: "playlists", @@ -213,9 +230,6 @@ namespace Manager.Data.Migrations migrationBuilder.DropTable( name: "captions"); - migrationBuilder.DropTable( - name: "channels"); - migrationBuilder.DropTable( name: "http_cookies"); @@ -225,6 +239,9 @@ namespace Manager.Data.Migrations migrationBuilder.DropTable( name: "media_formats"); + migrationBuilder.DropTable( + name: "client_accounts"); + migrationBuilder.DropTable( name: "playlists"); @@ -232,7 +249,7 @@ namespace Manager.Data.Migrations name: "media"); migrationBuilder.DropTable( - name: "client_accounts"); + name: "channels"); } } } diff --git a/Manager.Data/Migrations/LibraryDbContextModelSnapshot.cs b/Manager.Data/Migrations/LibraryDbContextModelSnapshot.cs index e284ea3..586c94a 100644 --- a/Manager.Data/Migrations/LibraryDbContextModelSnapshot.cs +++ b/Manager.Data/Migrations/LibraryDbContextModelSnapshot.cs @@ -86,8 +86,7 @@ namespace Manager.Data.Migrations b.Property("LastModifiedUtc") .HasColumnType("TEXT"); - b.Property("Name") - .IsRequired() + b.Property("UserAgent") .HasMaxLength(100) .HasColumnType("TEXT"); @@ -207,6 +206,8 @@ namespace Manager.Data.Migrations b.HasKey("Id"); + b.HasIndex("ChannelId"); + b.ToTable("media", (string)null); }); @@ -315,6 +316,15 @@ namespace Manager.Data.Migrations .IsRequired(); }); + modelBuilder.Entity("Manager.Data.Entities.LibraryContext.ClientAccountEntity", b => + { + b.HasOne("Manager.Data.Entities.LibraryContext.ChannelEntity", null) + .WithOne("ClientAccount") + .HasForeignKey("Manager.Data.Entities.LibraryContext.ClientAccountEntity", "Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("Manager.Data.Entities.LibraryContext.HttpCookieEntity", b => { b.HasOne("Manager.Data.Entities.LibraryContext.ClientAccountEntity", null) @@ -339,6 +349,15 @@ namespace Manager.Data.Migrations .IsRequired(); }); + modelBuilder.Entity("Manager.Data.Entities.LibraryContext.MediaEntity", b => + { + b.HasOne("Manager.Data.Entities.LibraryContext.ChannelEntity", null) + .WithMany("Media") + .HasForeignKey("ChannelId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("Manager.Data.Entities.LibraryContext.MediaFormatEntity", b => { b.HasOne("Manager.Data.Entities.LibraryContext.MediaEntity", null) @@ -350,18 +369,25 @@ namespace Manager.Data.Migrations modelBuilder.Entity("Manager.Data.Entities.LibraryContext.PlaylistEntity", b => { - b.HasOne("Manager.Data.Entities.LibraryContext.ClientAccountEntity", null) + b.HasOne("Manager.Data.Entities.LibraryContext.ChannelEntity", null) .WithMany("Playlists") .HasForeignKey("ChannelId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); + modelBuilder.Entity("Manager.Data.Entities.LibraryContext.ChannelEntity", b => + { + b.Navigation("ClientAccount"); + + b.Navigation("Media"); + + b.Navigation("Playlists"); + }); + modelBuilder.Entity("Manager.Data.Entities.LibraryContext.ClientAccountEntity", b => { b.Navigation("HttpCookies"); - - b.Navigation("Playlists"); }); modelBuilder.Entity("Manager.Data.Entities.LibraryContext.MediaEntity", b => diff --git a/README.md b/README.md index ff6e788..eab1a03 100644 --- a/README.md +++ b/README.md @@ -12,4 +12,7 @@ Update the database ```shell dotnet ef database update --project Manager.Data --startup-project Manager.App --context Manager.Data.Contexts.LibraryDbContext ``` - +Remove migration +```shell +dotnet ef migrations remove --project Manager.Data --startup-project Manager.App --context Manager.Data.Contexts.LibraryDbContext +```