From 1e6c7a47a45d704e06c6a087e1db19f659d49bf6 Mon Sep 17 00:00:00 2001 From: Henry Trumme Date: Tue, 22 Apr 2025 00:59:47 +0200 Subject: [PATCH] Adds Database Structure in C# with Entity Framework --- WatchLog/Components/Layout/NavMenu.razor | 8 +- WatchLog/Components/Pages/Counter.razor | 19 - WatchLog/Components/Pages/Weather.razor | 64 - WatchLog/Data/Database/Global/Admin.cs | 17 + WatchLog/Data/Database/Global/Genre.cs | 23 + WatchLog/Data/Database/Global/GlobalEntity.cs | 45 + .../Database/Global/LinkTableGlobalGenre.cs | 24 + .../Data/Database/Global/StreamingPlatform.cs | 22 + WatchLog/Data/Database/Global/Type.cs | 18 + WatchLog/Data/Database/Global/User.cs | 32 + WatchLog/Data/Database/Private/Label.cs | 32 + .../Database/Private/LinkTablePrivateLabel.cs | 21 + .../LinkTablePrivateStreamingPlatform.cs | 21 + .../Data/Database/Private/PrivateEntity.cs | 52 + .../Data/Database/Private/UserWatchStatus.cs | 38 + .../Database/Shared/LinkTableSharedLabel.cs | 22 + .../LinkTableSharedStreamingPlatform.cs | 21 + .../Database/Shared/LinkTableSharedUser.cs | 21 + WatchLog/Data/Database/Shared/SharedList.cs | 32 + .../Data/Database/Shared/SharedListEntity.cs | 48 + .../Data/Database/Shared/SharedListLabel.cs | 37 + .../Data/Database/Shared/SharedWatchStatus.cs | 43 + WatchLog/Data/WatchLogDataContext.cs | 44 + WatchLog/Program.cs | 7 + WatchLog/Properties/launchSettings.json | 74 +- WatchLog/WatchLog.csproj | 13 + WatchLog/WatchLog.csproj.user | 3 + WatchLog/appsettings.json | 3 + .../obj/Debug/net8.0/WatchLog.AssemblyInfo.cs | 13 +- .../net8.0/WatchLog.AssemblyInfoInputs.cache | 2 +- ....GeneratedMSBuildEditorConfig.editorconfig | 16 +- .../obj/Debug/net8.0/WatchLog.assets.cache | Bin 228 -> 51839 bytes ...CoreApp,Version=v8.0.AssemblyAttributes.cs | 4 + .../Release/net8.0/WatchLog.AssemblyInfo.cs | 24 + .../net8.0/WatchLog.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 57 + .../Release/net8.0/WatchLog.GlobalUsings.g.cs | 17 + ...hLog.MvcApplicationPartsAssemblyInfo.cache | 0 .../obj/Release/net8.0/WatchLog.assets.cache | Bin 0 -> 51839 bytes .../WatchLog.csproj.AssemblyReference.cache | Bin 0 -> 14057 bytes .../WatchLog.csproj.CoreCompileInputs.cache | 1 + .../WatchLog.csproj.FileListAbsolute.txt | 161 + .../Release/net8.0/WatchLog.csproj.Up2Date | 0 WatchLog/obj/Release/net8.0/WatchLog.dll | Bin 0 -> 98816 bytes .../net8.0/WatchLog.genruntimeconfig.cache | 1 + WatchLog/obj/Release/net8.0/WatchLog.pdb | Bin 0 -> 45352 bytes WatchLog/obj/Release/net8.0/apphost.exe | Bin 0 -> 139264 bytes WatchLog/obj/Release/net8.0/ref/WatchLog.dll | Bin 0 -> 25088 bytes .../obj/Release/net8.0/refint/WatchLog.dll | Bin 0 -> 25088 bytes .../Layout/MainLayout.razor.rz.scp.css | 96 + .../Layout/NavMenu.razor.rz.scp.css | 105 + .../scopedcss/bundle/WatchLog.styles.css | 203 ++ .../projectbundle/WatchLog.bundle.scp.css | 203 ++ .../staticwebassets.build.endpoints.json | 416 +++ .../Release/net8.0/staticwebassets.build.json | 640 ++++ .../net8.0/staticwebassets.development.json | 1 + .../Release/net8.0/staticwebassets.pack.json | 45 + ...aticwebassets.references.upToDateCheck.txt | 0 .../net8.0/staticwebassets.removed.txt | 0 .../net8.0/staticwebassets.upToDateCheck.txt | 4 + ...t.AspNetCore.StaticWebAssetEndpoints.props | 64 + ...Microsoft.AspNetCore.StaticWebAssets.props | 94 + .../msbuild.build.WatchLog.props | 4 + ...msbuild.buildMultiTargeting.WatchLog.props | 3 + .../msbuild.buildTransitive.WatchLog.props | 3 + ...atchLog.csproj.EntityFrameworkCore.targets | 28 + .../obj/WatchLog.csproj.nuget.dgspec.json | 18 + WatchLog/obj/WatchLog.csproj.nuget.g.props | 9 + WatchLog/obj/WatchLog.csproj.nuget.g.targets | 11 +- WatchLog/obj/project.assets.json | 3234 ++++++++++++++++- WatchLog/obj/project.nuget.cache | 55 +- 71 files changed, 6197 insertions(+), 140 deletions(-) delete mode 100644 WatchLog/Components/Pages/Counter.razor delete mode 100644 WatchLog/Components/Pages/Weather.razor create mode 100644 WatchLog/Data/Database/Global/Admin.cs create mode 100644 WatchLog/Data/Database/Global/Genre.cs create mode 100644 WatchLog/Data/Database/Global/GlobalEntity.cs create mode 100644 WatchLog/Data/Database/Global/LinkTableGlobalGenre.cs create mode 100644 WatchLog/Data/Database/Global/StreamingPlatform.cs create mode 100644 WatchLog/Data/Database/Global/Type.cs create mode 100644 WatchLog/Data/Database/Global/User.cs create mode 100644 WatchLog/Data/Database/Private/Label.cs create mode 100644 WatchLog/Data/Database/Private/LinkTablePrivateLabel.cs create mode 100644 WatchLog/Data/Database/Private/LinkTablePrivateStreamingPlatform.cs create mode 100644 WatchLog/Data/Database/Private/PrivateEntity.cs create mode 100644 WatchLog/Data/Database/Private/UserWatchStatus.cs create mode 100644 WatchLog/Data/Database/Shared/LinkTableSharedLabel.cs create mode 100644 WatchLog/Data/Database/Shared/LinkTableSharedStreamingPlatform.cs create mode 100644 WatchLog/Data/Database/Shared/LinkTableSharedUser.cs create mode 100644 WatchLog/Data/Database/Shared/SharedList.cs create mode 100644 WatchLog/Data/Database/Shared/SharedListEntity.cs create mode 100644 WatchLog/Data/Database/Shared/SharedListLabel.cs create mode 100644 WatchLog/Data/Database/Shared/SharedWatchStatus.cs create mode 100644 WatchLog/Data/WatchLogDataContext.cs create mode 100644 WatchLog/obj/Release/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs create mode 100644 WatchLog/obj/Release/net8.0/WatchLog.AssemblyInfo.cs create mode 100644 WatchLog/obj/Release/net8.0/WatchLog.AssemblyInfoInputs.cache create mode 100644 WatchLog/obj/Release/net8.0/WatchLog.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 WatchLog/obj/Release/net8.0/WatchLog.GlobalUsings.g.cs create mode 100644 WatchLog/obj/Release/net8.0/WatchLog.MvcApplicationPartsAssemblyInfo.cache create mode 100644 WatchLog/obj/Release/net8.0/WatchLog.assets.cache create mode 100644 WatchLog/obj/Release/net8.0/WatchLog.csproj.AssemblyReference.cache create mode 100644 WatchLog/obj/Release/net8.0/WatchLog.csproj.CoreCompileInputs.cache create mode 100644 WatchLog/obj/Release/net8.0/WatchLog.csproj.FileListAbsolute.txt create mode 100644 WatchLog/obj/Release/net8.0/WatchLog.csproj.Up2Date create mode 100644 WatchLog/obj/Release/net8.0/WatchLog.dll create mode 100644 WatchLog/obj/Release/net8.0/WatchLog.genruntimeconfig.cache create mode 100644 WatchLog/obj/Release/net8.0/WatchLog.pdb create mode 100644 WatchLog/obj/Release/net8.0/apphost.exe create mode 100644 WatchLog/obj/Release/net8.0/ref/WatchLog.dll create mode 100644 WatchLog/obj/Release/net8.0/refint/WatchLog.dll create mode 100644 WatchLog/obj/Release/net8.0/scopedcss/Components/Layout/MainLayout.razor.rz.scp.css create mode 100644 WatchLog/obj/Release/net8.0/scopedcss/Components/Layout/NavMenu.razor.rz.scp.css create mode 100644 WatchLog/obj/Release/net8.0/scopedcss/bundle/WatchLog.styles.css create mode 100644 WatchLog/obj/Release/net8.0/scopedcss/projectbundle/WatchLog.bundle.scp.css create mode 100644 WatchLog/obj/Release/net8.0/staticwebassets.build.endpoints.json create mode 100644 WatchLog/obj/Release/net8.0/staticwebassets.build.json create mode 100644 WatchLog/obj/Release/net8.0/staticwebassets.development.json create mode 100644 WatchLog/obj/Release/net8.0/staticwebassets.pack.json create mode 100644 WatchLog/obj/Release/net8.0/staticwebassets.references.upToDateCheck.txt create mode 100644 WatchLog/obj/Release/net8.0/staticwebassets.removed.txt create mode 100644 WatchLog/obj/Release/net8.0/staticwebassets.upToDateCheck.txt create mode 100644 WatchLog/obj/Release/net8.0/staticwebassets/msbuild.WatchLog.Microsoft.AspNetCore.StaticWebAssetEndpoints.props create mode 100644 WatchLog/obj/Release/net8.0/staticwebassets/msbuild.WatchLog.Microsoft.AspNetCore.StaticWebAssets.props create mode 100644 WatchLog/obj/Release/net8.0/staticwebassets/msbuild.build.WatchLog.props create mode 100644 WatchLog/obj/Release/net8.0/staticwebassets/msbuild.buildMultiTargeting.WatchLog.props create mode 100644 WatchLog/obj/Release/net8.0/staticwebassets/msbuild.buildTransitive.WatchLog.props create mode 100644 WatchLog/obj/WatchLog.csproj.EntityFrameworkCore.targets diff --git a/WatchLog/Components/Layout/NavMenu.razor b/WatchLog/Components/Layout/NavMenu.razor index fd642c8..2df568b 100644 --- a/WatchLog/Components/Layout/NavMenu.razor +++ b/WatchLog/Components/Layout/NavMenu.razor @@ -15,14 +15,14 @@ diff --git a/WatchLog/Components/Pages/Counter.razor b/WatchLog/Components/Pages/Counter.razor deleted file mode 100644 index 1a4f8e7..0000000 --- a/WatchLog/Components/Pages/Counter.razor +++ /dev/null @@ -1,19 +0,0 @@ -@page "/counter" -@rendermode InteractiveServer - -Counter - -

Counter

- -

Current count: @currentCount

- - - -@code { - private int currentCount = 0; - - private void IncrementCount() - { - currentCount++; - } -} diff --git a/WatchLog/Components/Pages/Weather.razor b/WatchLog/Components/Pages/Weather.razor deleted file mode 100644 index 43a1ecb..0000000 --- a/WatchLog/Components/Pages/Weather.razor +++ /dev/null @@ -1,64 +0,0 @@ -@page "/weather" -@attribute [StreamRendering] - -Weather - -

Weather

- -

This component demonstrates showing data.

- -@if (forecasts == null) -{ -

Loading...

-} -else -{ - - - - - - - - - - - @foreach (var forecast in forecasts) - { - - - - - - - } - -
DateTemp. (C)Temp. (F)Summary
@forecast.Date.ToShortDateString()@forecast.TemperatureC@forecast.TemperatureF@forecast.Summary
-} - -@code { - private WeatherForecast[]? forecasts; - - protected override async Task OnInitializedAsync() - { - // Simulate asynchronous loading to demonstrate streaming rendering - await Task.Delay(500); - - var startDate = DateOnly.FromDateTime(DateTime.Now); - var summaries = new[] { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" }; - forecasts = Enumerable.Range(1, 5).Select(index => new WeatherForecast - { - Date = startDate.AddDays(index), - TemperatureC = Random.Shared.Next(-20, 55), - Summary = summaries[Random.Shared.Next(summaries.Length)] - }).ToArray(); - } - - private class WeatherForecast - { - public DateOnly Date { get; set; } - public int TemperatureC { get; set; } - public string? Summary { get; set; } - public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); - } -} diff --git a/WatchLog/Data/Database/Global/Admin.cs b/WatchLog/Data/Database/Global/Admin.cs new file mode 100644 index 0000000..a0f5f7d --- /dev/null +++ b/WatchLog/Data/Database/Global/Admin.cs @@ -0,0 +1,17 @@ +using System.ComponentModel.DataAnnotations; + +namespace WatchLog.Data +{ + public class Admin + { + [Key] + public int Id { get; set; } + + [Required] + [MaxLength(100)] + public required string Name { get; set; } + + [Required] + public required string Password { get; set; } // Important: Save as HASH + } +} \ No newline at end of file diff --git a/WatchLog/Data/Database/Global/Genre.cs b/WatchLog/Data/Database/Global/Genre.cs new file mode 100644 index 0000000..39efcdb --- /dev/null +++ b/WatchLog/Data/Database/Global/Genre.cs @@ -0,0 +1,23 @@ +using System.ComponentModel.DataAnnotations; + +namespace WatchLog.Data +{ + public class Genre + { + [Key] + public int Id { get; set; } + + [Required] + [MaxLength(50)] + public required string Name { get; set; } + + [Required] + public required DateTime CreationTime { get; set; } + + public DateTime? LastChange { get; set; } + + + // --- Navigation Properties --- + public virtual ICollection LinkTableGlobalGenres { get; set; } = new List(); + } +} \ No newline at end of file diff --git a/WatchLog/Data/Database/Global/GlobalEntity.cs b/WatchLog/Data/Database/Global/GlobalEntity.cs new file mode 100644 index 0000000..b3babc4 --- /dev/null +++ b/WatchLog/Data/Database/Global/GlobalEntity.cs @@ -0,0 +1,45 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace WatchLog.Data +{ + public class GlobalEntity + { + [Key] + public int Id { get; set; } + + [Required] + [MaxLength(200)] + public required string Title { get; set; } + + [MaxLength(500)] + public string? PicturePath { get; set; } + + [Required] + public required DateTime CreationTime { get; set; } + + public DateTime? LastChange { get; set; } + + + // --- Foreign Keys --- + [Required] + public int TypeId { get; set; } + + [Required] + public int CreatorId { get; set; } + + + // --- Navigation Properties --- + [ForeignKey(nameof(TypeId))] + public virtual Type Type { get; set; } = null!; + + [ForeignKey(nameof(CreatorId))] + public virtual User User { get; set; } = null!; + + public virtual ICollection LinkTableGlobalGenres { get; set; } = new List(); + + public virtual ICollection PrivateEntities { get; set; } = new List(); + + public virtual ICollection SharedListEntities { get; set; } = new List(); + } +} \ No newline at end of file diff --git a/WatchLog/Data/Database/Global/LinkTableGlobalGenre.cs b/WatchLog/Data/Database/Global/LinkTableGlobalGenre.cs new file mode 100644 index 0000000..8568ebc --- /dev/null +++ b/WatchLog/Data/Database/Global/LinkTableGlobalGenre.cs @@ -0,0 +1,24 @@ +using System.ComponentModel.DataAnnotations.Schema; +using Microsoft.EntityFrameworkCore; + +namespace WatchLog.Data +{ + [PrimaryKey(nameof(GlobalEntityId), nameof(GenreId))] + public class LinkTableGlobalGenre + { + // --- Foreign Keys --- + [Column(Order = 0)] + public int GlobalEntityId { get; set; } + + [Column(Order = 1)] + public int GenreId { get; set; } + + + // --- Navigation Properties --- + [ForeignKey(nameof(GlobalEntityId))] + public virtual GlobalEntity GlobalEntity { get; set; } = null!; + + [ForeignKey(nameof(GenreId))] + public virtual Genre Genre { get; set; } = null!; + } +} \ No newline at end of file diff --git a/WatchLog/Data/Database/Global/StreamingPlatform.cs b/WatchLog/Data/Database/Global/StreamingPlatform.cs new file mode 100644 index 0000000..5acf74a --- /dev/null +++ b/WatchLog/Data/Database/Global/StreamingPlatform.cs @@ -0,0 +1,22 @@ +using System.ComponentModel.DataAnnotations; + +namespace WatchLog.Data +{ + public class StreamingPlatform + { + [Key] + public int Id { get; set; } + + [Required] + [MaxLength(100)] + public required string Name { get; set; } + + [Required] + public string? PicturePath { get; set; } + + [Required] + public required DateTime CreationTime { get; set; } + + public DateTime? LastChange { get; set; } + } +} \ No newline at end of file diff --git a/WatchLog/Data/Database/Global/Type.cs b/WatchLog/Data/Database/Global/Type.cs new file mode 100644 index 0000000..3417780 --- /dev/null +++ b/WatchLog/Data/Database/Global/Type.cs @@ -0,0 +1,18 @@ +using System.ComponentModel.DataAnnotations; + +namespace WatchLog.Data +{ + public class Type + { + [Key] + public int Id { get; set; } + + [Required] + [MaxLength(50)] + public required string Name { get; set; } + + + // --- Navigation Property --- + public virtual ICollection GlobalEntities { get; set; } = new List(); + } +} \ No newline at end of file diff --git a/WatchLog/Data/Database/Global/User.cs b/WatchLog/Data/Database/Global/User.cs new file mode 100644 index 0000000..e831dd1 --- /dev/null +++ b/WatchLog/Data/Database/Global/User.cs @@ -0,0 +1,32 @@ +using System.ComponentModel.DataAnnotations; + +namespace WatchLog.Data +{ + public class User + { + [Key] + public int Id { get; set; } + + [Required] + [MaxLength(100)] + public required string Name { get; set; } + + [MaxLength(255)] + public string? Email { get; set; } + + [Required] + public required string Password { get; set; } // Important: Save as HASH + + + // --- Navigation Properties --- + public virtual ICollection PrivateEntities { get; set; } = new List(); + + public virtual ICollection GlobalEntities { get; set; } = new List(); + + public virtual ICollection