From 0fb27260941b9c688148d2be28536608d464fec0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Janis=20Daniel=20Da=CC=88hne?=
 <janis.daehne2@student.uni-halle.de>
Date: Fri, 30 Aug 2019 16:57:17 +0200
Subject: [PATCH] - fk on release to exercise restrict

---
 src/ClientServer/Db/YapexDbContext.cs         |    2 +-
 ...142059_EnsureNoReleaseDeleteEx.Designer.cs | 2162 +++++++++++++++++
 .../20190830142059_EnsureNoReleaseDeleteEx.cs |   39 +
 .../Migrations/YapexDbContextModelSnapshot.cs |    4 +-
 4 files changed, 2204 insertions(+), 3 deletions(-)
 create mode 100755 src/ClientServer/Migrations/20190830142059_EnsureNoReleaseDeleteEx.Designer.cs
 create mode 100755 src/ClientServer/Migrations/20190830142059_EnsureNoReleaseDeleteEx.cs

diff --git a/src/ClientServer/Db/YapexDbContext.cs b/src/ClientServer/Db/YapexDbContext.cs
index a5693a3..21461d0 100644
--- a/src/ClientServer/Db/YapexDbContext.cs
+++ b/src/ClientServer/Db/YapexDbContext.cs
@@ -587,7 +587,7 @@ namespace ClientServer.Db
                 .WithOne(p => p.Exercise)
                 .HasForeignKey(p => p.ExerciseId)
                 .IsRequired()
-                .OnDelete(DeleteBehavior.Cascade)
+                .OnDelete(DeleteBehavior.Restrict)
                 ;
 
 
diff --git a/src/ClientServer/Migrations/20190830142059_EnsureNoReleaseDeleteEx.Designer.cs b/src/ClientServer/Migrations/20190830142059_EnsureNoReleaseDeleteEx.Designer.cs
new file mode 100755
index 0000000..3796e14
--- /dev/null
+++ b/src/ClientServer/Migrations/20190830142059_EnsureNoReleaseDeleteEx.Designer.cs
@@ -0,0 +1,2162 @@
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using ClientServer.Db;
+using ClientServer.Models.Exercises.Release;
+
+namespace ClientServer.Migrations
+{
+    [DbContext(typeof(YapexDbContext))]
+    [Migration("20190830142059_EnsureNoReleaseDeleteEx")]
+    partial class EnsureNoReleaseDeleteEx
+    {
+        protected override void BuildTargetModel(ModelBuilder modelBuilder)
+        {
+            modelBuilder
+                .HasAnnotation("ProductVersion", "1.0.3");
+
+            modelBuilder.Entity("ClientServer.Models.AwaitDummy", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd();
+
+                    b.HasKey("Id");
+
+                    b.ToTable("AwaitDummies");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.CustomProjects.CustomProject", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd();
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<string>("DisplayName")
+                        .HasMaxLength(2000);
+
+                    b.Property<int>("LastEditorPLangId");
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.Property<int>("UserId");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("UserId");
+
+                    b.ToTable("CustomProjects");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.CustomProjects.CustomProjectDescription", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd();
+
+                    b.Property<string>("Content")
+                        .HasMaxLength(50000);
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<int>("CustomProjectId");
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("CustomProjectId")
+                        .IsUnique();
+
+                    b.ToTable("CustomProjectDescriptions");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.CustomProjects.CustomProjectDescriptionWithFileAsAssetReference", b =>
+                {
+                    b.Property<int>("CustomProjectDescriptionId");
+
+                    b.Property<int>("FileReferenceUserFileAssetId");
+
+                    b.HasKey("CustomProjectDescriptionId", "FileReferenceUserFileAssetId");
+
+                    b.HasIndex("CustomProjectDescriptionId");
+
+                    b.HasIndex("FileReferenceUserFileAssetId");
+
+                    b.ToTable("CustomProjectDescriptionWithFileAsAssetReferences");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.CustomProjects.CustomProjectSolution", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd();
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<int>("CustomProjectId");
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.Property<int?>("MainFileId");
+
+                    b.Property<int>("PLangId");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("CustomProjectId");
+
+                    b.HasIndex("MainFileId")
+                        .IsUnique();
+
+                    b.HasIndex("PLangId");
+
+                    b.ToTable("CustomProjectSolutions");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.CustomProjects.CustomProjectSolutionFile", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd();
+
+                    b.Property<string>("Content")
+                        .HasMaxLength(70000);
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<int?>("CustomProjectSolutionId")
+                        .IsRequired();
+
+                    b.Property<int>("DisplayIndex");
+
+                    b.Property<string>("FileNameWithExtension")
+                        .HasMaxLength(2000);
+
+                    b.Property<bool>("IsDisplayed");
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("CustomProjectSolutionId");
+
+                    b.ToTable("CustomProjectSolutionFiles");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.CustomProjects.CustomProjectTest", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd();
+
+                    b.Property<string>("Content")
+                        .HasMaxLength(80000);
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<int>("CustomProjectId");
+
+                    b.Property<int>("DisplayIndex");
+
+                    b.Property<string>("DisplayName")
+                        .HasMaxLength(2000);
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.Property<int>("TestTypeId");
+
+                    b.Property<int>("Weight");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("CustomProjectId");
+
+                    b.HasIndex("TestTypeId");
+
+                    b.ToTable("CustomProjectTests");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.CustomProjects.CustomProjectTestAsset", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd();
+
+                    b.Property<byte[]>("Content");
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<string>("DisplayName")
+                        .HasMaxLength(2000);
+
+                    b.Property<string>("Hash")
+                        .HasMaxLength(2000);
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.Property<string>("MimeType")
+                        .HasMaxLength(2000);
+
+                    b.HasKey("Id");
+
+                    b.ToTable("CustomProjectTestAssets");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.CustomProjects.CustomProjectTestSettings", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd();
+
+                    b.Property<int>("CompileTimeoutInMs");
+
+                    b.Property<string>("CompilerOptions")
+                        .HasMaxLength(2000);
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<int>("CustomProjectTestId");
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.Property<int>("MaxDiskSpaceInKb");
+
+                    b.Property<int>("MemoryLimitInKb");
+
+                    b.Property<int>("TimeoutInMs");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("CustomProjectTestId")
+                        .IsUnique();
+
+                    b.ToTable("CustomProjectTestSettings");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.CustomProjects.CustomProjectTestWithFileAsAssetReference", b =>
+                {
+                    b.Property<int>("CustomProjectTestId");
+
+                    b.Property<int>("FileReferenceUserFileAssetId");
+
+                    b.HasKey("CustomProjectTestId", "FileReferenceUserFileAssetId");
+
+                    b.HasIndex("CustomProjectTestId");
+
+                    b.HasIndex("FileReferenceUserFileAssetId");
+
+                    b.ToTable("CustomProjectTestWithFileAsAssetReferences");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.CustomProjects.CustomProjectTestWithSolutionAsTestResult", b =>
+                {
+                    b.Property<int>("CustomProjectSolutionId");
+
+                    b.Property<int>("CustomProjectTestId");
+
+                    b.Property<bool>("CharacterLimitExceeded");
+
+                    b.Property<int?>("CharacterLimitUsed");
+
+                    b.Property<int?>("CompileTimeoutInMsUsed");
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<bool?>("HasCompiled");
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.Property<bool?>("Passed");
+
+                    b.Property<int?>("ProgramExitCode");
+
+                    b.Property<string>("Protocol")
+                        .HasMaxLength(160100);
+
+                    b.Property<string>("RunnerVersion")
+                        .HasMaxLength(2000);
+
+                    b.Property<int?>("TestResultCode");
+
+                    b.Property<string>("TestServerVersion")
+                        .HasMaxLength(2000);
+
+                    b.Property<int?>("TimeForCompiling");
+
+                    b.Property<int?>("TimeForUserProgram");
+
+                    b.Property<int?>("TimeoutInMsUsed");
+
+                    b.HasKey("CustomProjectSolutionId", "CustomProjectTestId");
+
+                    b.HasIndex("CustomProjectSolutionId");
+
+                    b.HasIndex("CustomProjectTestId");
+
+                    b.ToTable("CustomProjectTestWithSolutionAsTestResults");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.AfterSolutions.AfterSolution", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd();
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.Property<int?>("MainFileId");
+
+                    b.Property<int>("SolutionExerciseReleaseId");
+
+                    b.Property<int>("SolutionPLangId");
+
+                    b.Property<int>("SolutionUserId");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("MainFileId")
+                        .IsUnique();
+
+                    b.HasIndex("SolutionUserId", "SolutionExerciseReleaseId", "SolutionPLangId")
+                        .IsUnique();
+
+                    b.ToTable("AfterSolutions");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.AfterSolutions.AfterSolutionFile", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd();
+
+                    b.Property<int>("AfterSolutionId");
+
+                    b.Property<string>("Content")
+                        .HasMaxLength(70000);
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<int>("DisplayIndex");
+
+                    b.Property<string>("FileNameWithExtension")
+                        .HasMaxLength(2000);
+
+                    b.Property<bool>("IsDisplayed");
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.Property<int?>("TemplateFileId");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("AfterSolutionId");
+
+                    b.HasIndex("TemplateFileId");
+
+                    b.ToTable("AfterSolutionFiles");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.AfterSolutions.CustomTestWithAfterSolutionAsTestResult", b =>
+                {
+                    b.Property<int>("CustomTestId");
+
+                    b.Property<int>("AfterSolutionId");
+
+                    b.Property<bool>("CharacterLimitExceeded");
+
+                    b.Property<int?>("CharacterLimitUsed");
+
+                    b.Property<int?>("CompileTimeoutInMsUsed");
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<bool?>("HasCompiled");
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.Property<bool?>("Passed");
+
+                    b.Property<int?>("ProgramExitCode");
+
+                    b.Property<string>("Protocol")
+                        .HasMaxLength(160100);
+
+                    b.Property<string>("RunnerVersion")
+                        .HasMaxLength(2000);
+
+                    b.Property<int?>("TestResultCode");
+
+                    b.Property<string>("TestServerVersion")
+                        .HasMaxLength(2000);
+
+                    b.Property<int?>("TimeForCompiling");
+
+                    b.Property<int?>("TimeForUserProgram");
+
+                    b.Property<int?>("TimeoutInMsUsed");
+
+                    b.HasKey("CustomTestId", "AfterSolutionId");
+
+                    b.HasIndex("AfterSolutionId");
+
+                    b.HasIndex("CustomTestId");
+
+                    b.ToTable("CustomTestWithAfterSolutionAsTestResults");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.AfterSolutions.TestWithAfterSolutionAsTestResult", b =>
+                {
+                    b.Property<int>("TestId");
+
+                    b.Property<int>("AfterSolutionId");
+
+                    b.Property<bool>("CharacterLimitExceeded");
+
+                    b.Property<int?>("CharacterLimitUsed");
+
+                    b.Property<int?>("CompileTimeoutInMsUsed");
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<bool?>("HasCompiled");
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.Property<bool?>("Passed");
+
+                    b.Property<int?>("ProgramExitCode");
+
+                    b.Property<string>("Protocol")
+                        .HasMaxLength(160100);
+
+                    b.Property<string>("RunnerVersion")
+                        .HasMaxLength(2000);
+
+                    b.Property<int?>("TestResultCode");
+
+                    b.Property<string>("TestServerVersion")
+                        .HasMaxLength(2000);
+
+                    b.Property<int?>("TimeForCompiling");
+
+                    b.Property<int?>("TimeForUserProgram");
+
+                    b.Property<int?>("TimeoutInMsUsed");
+
+                    b.HasKey("TestId", "AfterSolutionId");
+
+                    b.HasIndex("AfterSolutionId");
+
+                    b.HasIndex("TestId");
+
+                    b.ToTable("TestWithAfterSolutionAsTestResults");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.CodeTemplate", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd();
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<int>("ExerciseId");
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.Property<int?>("MainFileId");
+
+                    b.Property<int>("PLangId");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("ExerciseId");
+
+                    b.HasIndex("MainFileId")
+                        .IsUnique();
+
+                    b.HasIndex("PLangId");
+
+                    b.ToTable("Templates");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.CustomTestWithFileAsAssetReference", b =>
+                {
+                    b.Property<int>("CustomTestId");
+
+                    b.Property<int>("FileReferenceUserFileAssetId");
+
+                    b.HasKey("CustomTestId", "FileReferenceUserFileAssetId");
+
+                    b.HasIndex("CustomTestId");
+
+                    b.HasIndex("FileReferenceUserFileAssetId");
+
+                    b.ToTable("CustomTestWithFileAsAssetReferences");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.Exercise", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd();
+
+                    b.Property<bool>("CanUserCreateCustomTests");
+
+                    b.Property<bool>("CanUserCreateFiles");
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<string>("DisplayName")
+                        .HasMaxLength(2000);
+
+                    b.Property<bool>("IsOnlyVisibleToOwner");
+
+                    b.Property<bool>("IsPermanentlyLocked");
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.Property<string>("Note")
+                        .HasMaxLength(10000);
+
+                    b.Property<string>("ShortDescription")
+                        .HasMaxLength(2000);
+
+                    b.Property<int>("UserGroupId");
+
+                    b.Property<int?>("UserId");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("UserGroupId");
+
+                    b.HasIndex("UserId");
+
+                    b.ToTable("Exercises");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.ExerciseDescription", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd();
+
+                    b.Property<string>("Content")
+                        .HasMaxLength(50000);
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<int>("ExerciseId");
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("ExerciseId")
+                        .IsUnique();
+
+                    b.ToTable("ExerciseDescriptions");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.ExerciseDescriptionWithFileAsAssetReference", b =>
+                {
+                    b.Property<int>("ExerciseDescriptionId");
+
+                    b.Property<int>("FileReferenceMarkdownAssetId");
+
+                    b.HasKey("ExerciseDescriptionId", "FileReferenceMarkdownAssetId");
+
+                    b.HasIndex("ExerciseDescriptionId");
+
+                    b.HasIndex("FileReferenceMarkdownAssetId");
+
+                    b.ToTable("ExerciseDescriptionWithFileAsAssetReferences");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.MetaData", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd();
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<int>("ExerciseId");
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("ExerciseId")
+                        .IsUnique();
+
+                    b.ToTable("MetaDatas");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.Release.ExerciseRelease", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd();
+
+                    b.Property<DateTime?>("AutomaticEndAt");
+
+                    b.Property<DateTime?>("AutomaticStartAt");
+
+                    b.Property<int>("AvailableWorkingTimeInMinutes");
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<int>("ExerciseId");
+
+                    b.Property<string>("GeneratedCode")
+                        .IsRequired()
+                        .HasMaxLength(2000);
+
+                    b.Property<bool>("HadAutomaticAssessmentErrors");
+
+                    b.Property<bool>("HasAutomaticAssessmentFinished");
+
+                    b.Property<bool>("HasAutomaticAssessmentStarted");
+
+                    b.Property<bool>("HasLimitedWorkingTime");
+
+                    b.Property<bool>("HideExerciseLeaveActions");
+
+                    b.Property<bool>("HideInOverviews");
+
+                    b.Property<bool>("HidePrintOptions");
+
+                    b.Property<bool>("HideSiteHeaderBar");
+
+                    b.Property<bool>("IsReleased");
+
+                    b.Property<bool>("IsVisibleToAllAfterRelease");
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.Property<int?>("MaxManualPoint");
+
+                    b.Property<string>("Note")
+                        .HasMaxLength(10000);
+
+                    b.Property<int>("PLangId");
+
+                    b.Property<int>("ReleaseDurationType");
+
+                    b.Property<int>("ReleaseStartType");
+
+                    b.Property<DateTime?>("ReleasedAt");
+
+                    b.Property<bool>("RunAlsoNormalTests");
+
+                    b.Property<bool>("ShouldAutomaticAssessSubmissions");
+
+                    b.Property<bool>("ShouldClearClipboard");
+
+                    b.Property<bool>("ShowAdditionalLogButton");
+
+                    b.HasKey("Id");
+
+                    b.HasAlternateKey("GeneratedCode")
+                        .HasName("Unique_GeneratedCode");
+
+                    b.HasIndex("ExerciseId");
+
+                    b.HasIndex("PLangId");
+
+                    b.ToTable("ExerciseReleases");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.Solution.CustomTestWithSingleSolutionAsTestResult", b =>
+                {
+                    b.Property<int>("CustomTestId");
+
+                    b.Property<int>("SolutionUserId");
+
+                    b.Property<int>("SolutionExerciseReleaseId");
+
+                    b.Property<int>("SolutionPLangId");
+
+                    b.Property<bool>("CharacterLimitExceeded");
+
+                    b.Property<int?>("CharacterLimitUsed");
+
+                    b.Property<int?>("CompileTimeoutInMsUsed");
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<bool?>("HasCompiled");
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.Property<bool?>("Passed");
+
+                    b.Property<int?>("ProgramExitCode");
+
+                    b.Property<string>("Protocol")
+                        .HasMaxLength(160100);
+
+                    b.Property<string>("RunnerVersion")
+                        .HasMaxLength(2000);
+
+                    b.Property<int?>("TestResultCode");
+
+                    b.Property<string>("TestServerVersion")
+                        .HasMaxLength(2000);
+
+                    b.Property<int?>("TimeForCompiling");
+
+                    b.Property<int?>("TimeForUserProgram");
+
+                    b.Property<int?>("TimeoutInMsUsed");
+
+                    b.HasKey("CustomTestId", "SolutionUserId", "SolutionExerciseReleaseId", "SolutionPLangId");
+
+                    b.HasIndex("CustomTestId");
+
+                    b.HasIndex("SolutionUserId", "SolutionExerciseReleaseId", "SolutionPLangId");
+
+                    b.ToTable("CustomTestWithSingleSolutionAsTestResult");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.Solution.ExerciseReleaseWithUserAsParticipation", b =>
+                {
+                    b.Property<int>("UserId");
+
+                    b.Property<int>("ExerciseReleaseId");
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<int>("LastEditedPLangId");
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.Property<bool>("LockSolutionsFlag");
+
+                    b.Property<bool>("ShouldNotCount");
+
+                    b.HasKey("UserId", "ExerciseReleaseId");
+
+                    b.HasIndex("ExerciseReleaseId");
+
+                    b.HasIndex("LastEditedPLangId");
+
+                    b.HasIndex("UserId");
+
+                    b.ToTable("ExerciseReleaseWithUserAsParticipations");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.Solution.Solution", b =>
+                {
+                    b.Property<int>("UserId");
+
+                    b.Property<int>("ExerciseReleaseId");
+
+                    b.Property<int>("PLangId");
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<string>("LastEditingIpAddress")
+                        .HasMaxLength(2000);
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.Property<int?>("MainFileId");
+
+                    b.Property<string>("Note")
+                        .HasMaxLength(10000);
+
+                    b.HasKey("UserId", "ExerciseReleaseId", "PLangId");
+
+                    b.HasIndex("MainFileId")
+                        .IsUnique();
+
+                    b.HasIndex("PLangId");
+
+                    b.HasIndex("UserId", "ExerciseReleaseId");
+
+                    b.ToTable("Solutions");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.Solution.SolutionAssessment", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd();
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<int>("ExerciseReleaseId");
+
+                    b.Property<string>("FeedbackForStudent")
+                        .HasMaxLength(10000);
+
+                    b.Property<string>("LastAssessmentErrorMessage")
+                        .HasMaxLength(80000);
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.Property<int?>("ManualPoints");
+
+                    b.Property<int>("MaxNormalTestPoints");
+
+                    b.Property<int>("MaxSubmitTestPoints");
+
+                    b.Property<int?>("NormalTestPoints");
+
+                    b.Property<string>("NoteForOtherTutors")
+                        .HasMaxLength(10000);
+
+                    b.Property<int>("PLangId");
+
+                    b.Property<int?>("SubmitTestPoints");
+
+                    b.Property<int>("UserId");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("UserId", "ExerciseReleaseId", "PLangId")
+                        .IsUnique();
+
+                    b.ToTable("SolutionAssessment");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.Solution.SolutionFile", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd();
+
+                    b.Property<string>("Content")
+                        .HasMaxLength(70000);
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<int>("DisplayIndex");
+
+                    b.Property<string>("FileNameWithExtension")
+                        .HasMaxLength(2000);
+
+                    b.Property<bool>("IsDisplayed");
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.Property<int>("SolutionExerciseReleaseId");
+
+                    b.Property<int>("SolutionPLangId");
+
+                    b.Property<int>("SolutionUserId");
+
+                    b.Property<int?>("TemplateFileId");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("TemplateFileId");
+
+                    b.HasIndex("SolutionUserId", "SolutionExerciseReleaseId", "SolutionPLangId");
+
+                    b.ToTable("SolutionFiles");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.Solution.TestWithSingleSolutionAsTestResult", b =>
+                {
+                    b.Property<int>("TestId");
+
+                    b.Property<int>("SolutionUserId");
+
+                    b.Property<int>("SolutionExerciseReleaseId");
+
+                    b.Property<int>("SolutionPLangId");
+
+                    b.Property<bool>("CharacterLimitExceeded");
+
+                    b.Property<int?>("CharacterLimitUsed");
+
+                    b.Property<int?>("CompileTimeoutInMsUsed");
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<bool?>("HasCompiled");
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.Property<bool?>("Passed");
+
+                    b.Property<int?>("ProgramExitCode");
+
+                    b.Property<string>("Protocol")
+                        .HasMaxLength(160100);
+
+                    b.Property<string>("RunnerVersion")
+                        .HasMaxLength(2000);
+
+                    b.Property<int?>("TestResultCode");
+
+                    b.Property<string>("TestServerVersion")
+                        .HasMaxLength(2000);
+
+                    b.Property<int?>("TimeForCompiling");
+
+                    b.Property<int?>("TimeForUserProgram");
+
+                    b.Property<int?>("TimeoutInMsUsed");
+
+                    b.HasKey("TestId", "SolutionUserId", "SolutionExerciseReleaseId", "SolutionPLangId");
+
+                    b.HasIndex("TestId");
+
+                    b.HasIndex("SolutionUserId", "SolutionExerciseReleaseId", "SolutionPLangId");
+
+                    b.ToTable("TestWithSingleSolutionAsTestResult");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.Tag", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd();
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<string>("Description")
+                        .HasMaxLength(2000);
+
+                    b.Property<string>("DisplayName")
+                        .HasMaxLength(2000);
+
+                    b.Property<string>("HtmlBackgroundColor")
+                        .HasMaxLength(2000);
+
+                    b.Property<string>("HtmlColor")
+                        .HasMaxLength(2000);
+
+                    b.Property<string>("HtmlIcon")
+                        .HasMaxLength(2000);
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("DisplayName")
+                        .HasName("Unique_Tag");
+
+                    b.ToTable("Tags");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.TagWithMetaData", b =>
+                {
+                    b.Property<int>("TagId");
+
+                    b.Property<int>("MetaDataId");
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.HasKey("TagId", "MetaDataId");
+
+                    b.HasIndex("MetaDataId");
+
+                    b.HasIndex("TagId");
+
+                    b.ToTable("TagWithMetaDatas");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.TemplateFile", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd();
+
+                    b.Property<int?>("CodeTemplateId")
+                        .IsRequired();
+
+                    b.Property<string>("Content")
+                        .HasMaxLength(70000);
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<int>("DisplayIndex");
+
+                    b.Property<string>("FileNameWithExtension")
+                        .HasMaxLength(2000);
+
+                    b.Property<bool>("IsContentVisibleForUser");
+
+                    b.Property<bool>("IsEditableByUser");
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("CodeTemplateId");
+
+                    b.ToTable("TemplateFiles");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.Tests.CustomTest", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd();
+
+                    b.Property<string>("Content")
+                        .HasMaxLength(80000);
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<int>("DisplayIndex");
+
+                    b.Property<string>("DisplayName")
+                        .HasMaxLength(2000);
+
+                    b.Property<int>("ExerciseReleaseId");
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.Property<int>("TestTypeId");
+
+                    b.Property<int>("UserId");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("TestTypeId");
+
+                    b.HasIndex("UserId", "ExerciseReleaseId");
+
+                    b.ToTable("CustomTest");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.Tests.DefaultCustomTestSettings", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd();
+
+                    b.Property<int>("CompileTimeoutInMs");
+
+                    b.Property<string>("CompilerOptions")
+                        .HasMaxLength(2000);
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<int>("ExerciseId");
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.Property<int>("MaxDiskSpaceInKb");
+
+                    b.Property<int>("MemoryLimitInKb");
+
+                    b.Property<int>("TimeoutInMs");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("ExerciseId")
+                        .IsUnique();
+
+                    b.ToTable("DefaultCustomTestSettings");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.Tests.Test", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd();
+
+                    b.Property<string>("Content")
+                        .HasMaxLength(80000);
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<int>("DisplayIndex");
+
+                    b.Property<string>("DisplayName")
+                        .HasMaxLength(2000);
+
+                    b.Property<int>("ExerciseId");
+
+                    b.Property<bool>("IsSubmitTest");
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.Property<int>("TestTypeId");
+
+                    b.Property<int>("Weight");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("ExerciseId");
+
+                    b.HasIndex("TestTypeId");
+
+                    b.ToTable("Tests");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.Tests.TestSettings", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd();
+
+                    b.Property<int>("CompileTimeoutInMs");
+
+                    b.Property<string>("CompilerOptions")
+                        .HasMaxLength(2000);
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.Property<int>("MaxDiskSpaceInKb");
+
+                    b.Property<int>("MemoryLimitInKb");
+
+                    b.Property<int>("TestId");
+
+                    b.Property<int>("TimeoutInMs");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("TestId")
+                        .IsUnique();
+
+                    b.ToTable("TestCaseSettingses");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.Tests.TestType", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd();
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<string>("DisplayName")
+                        .HasMaxLength(2000);
+
+                    b.Property<string>("InternalName")
+                        .HasMaxLength(2000);
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("TestTypes");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.TestWithFileAsAssetReference", b =>
+                {
+                    b.Property<int>("TestId");
+
+                    b.Property<int>("FileReferenceTestAssetId");
+
+                    b.HasKey("TestId", "FileReferenceTestAssetId");
+
+                    b.HasIndex("FileReferenceTestAssetId");
+
+                    b.HasIndex("TestId");
+
+                    b.ToTable("TestWithFileAsAssetReferences");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Files.FileReferenceMarkdownAsset", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd();
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<string>("Hash")
+                        .HasMaxLength(2000);
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.Property<string>("MimeType")
+                        .HasMaxLength(2000);
+
+                    b.Property<string>("OriginalName")
+                        .HasMaxLength(2000);
+
+                    b.Property<long>("SizeInBytes");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("FileReferenceMarkdownAssets");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Files.FileReferenceTestAsset", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd();
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<string>("Hash")
+                        .HasMaxLength(2000);
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.Property<string>("MimeType")
+                        .HasMaxLength(2000);
+
+                    b.Property<string>("OriginalName")
+                        .HasMaxLength(2000);
+
+                    b.Property<long>("SizeInBytes");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("FileReferenceTestAssets");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Files.FileReferenceUserFileAsset", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd();
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<string>("Hash")
+                        .HasMaxLength(2000);
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.Property<string>("MimeType")
+                        .HasMaxLength(2000);
+
+                    b.Property<string>("OriginalName")
+                        .HasMaxLength(2000);
+
+                    b.Property<long>("SizeInBytes");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("FileReferenceUserFileAssets");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Lang", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd();
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<string>("LangShortcut")
+                        .HasMaxLength(2000);
+
+                    b.Property<string>("Language")
+                        .HasMaxLength(2000);
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("Langs");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.PLang", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd();
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<string>("DisplayName")
+                        .HasMaxLength(2000);
+
+                    b.Property<string>("EditorHighlightModeName")
+                        .HasMaxLength(2000);
+
+                    b.Property<string>("FileExtensionsWithDot")
+                        .HasMaxLength(2000);
+
+                    b.Property<string>("InternalName")
+                        .HasMaxLength(2000);
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("PLangs");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Users.AuthToken", b =>
+                {
+                    b.Property<int>("UserId");
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<string>("CsrfToken")
+                        .HasMaxLength(2000);
+
+                    b.Property<DateTime>("ExpirationDateTime");
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.Property<string>("RandomSecret")
+                        .HasMaxLength(2000);
+
+                    b.Property<string>("UserAuthToken")
+                        .HasMaxLength(2000);
+
+                    b.HasKey("UserId");
+
+                    b.HasIndex("UserAuthToken")
+                        .IsUnique();
+
+                    b.HasIndex("UserId")
+                        .IsUnique();
+
+                    b.ToTable("AuthTokens");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Users.ExternalUser", b =>
+                {
+                    b.Property<int>("ExternalId")
+                        .ValueGeneratedOnAdd();
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<string>("Email")
+                        .HasMaxLength(2000);
+
+                    b.Property<string>("FirstName")
+                        .HasMaxLength(2000);
+
+                    b.Property<string>("LastName")
+                        .HasMaxLength(2000);
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.Property<bool>("NeedToRefreshData");
+
+                    b.Property<string>("Token")
+                        .IsRequired()
+                        .HasMaxLength(2000);
+
+                    b.Property<int>("UserId");
+
+                    b.HasKey("ExternalId");
+
+                    b.HasAlternateKey("Token")
+                        .HasName("Unique_ExternalToken");
+
+                    b.HasIndex("UserId")
+                        .IsUnique();
+
+                    b.ToTable("ExternalUsers");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Users.GroupRole", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd();
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<string>("DisplayName")
+                        .HasMaxLength(2000);
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("GroupRoles");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Users.GroupRolePermission", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd();
+
+                    b.Property<bool>("CanAddUserToGroup");
+
+                    b.Property<bool>("CanAssessExercises");
+
+                    b.Property<bool>("CanChangeExercises");
+
+                    b.Property<bool>("CanChangeGroupData");
+
+                    b.Property<bool>("CanChangeOtherMembersRole");
+
+                    b.Property<bool>("CanCreateExercises");
+
+                    b.Property<bool>("CanDeleteExercises");
+
+                    b.Property<bool>("CanLockExercisesPermanently");
+
+                    b.Property<bool>("CanManageExerciseReleases");
+
+                    b.Property<bool>("CanRemoveMemberFromGroup");
+
+                    b.Property<bool>("CanSeeExercisesFromOthersInGroup");
+
+                    b.Property<bool>("CanSeeOtherMembers");
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<int>("GroupRoleId");
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("GroupRoleId")
+                        .IsUnique();
+
+                    b.ToTable("GroupRolePermissions");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Users.Settings.CodeEditorSetting", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd();
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<int>("FontSize");
+
+                    b.Property<bool>("HighlightCurrentLine");
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.Property<bool>("ShowInvisibles");
+
+                    b.Property<bool>("ShowLineIndentions");
+
+                    b.Property<bool>("ShowLineNumbers");
+
+                    b.Property<int>("TabSize");
+
+                    b.Property<string>("Theme")
+                        .HasMaxLength(2000);
+
+                    b.Property<bool>("UseWrapping");
+
+                    b.Property<int>("UserSettingId");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("UserSettingId")
+                        .IsUnique();
+
+                    b.ToTable("CodeEditorSettings");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Users.Settings.UserSetting", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd();
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<int?>("LangId");
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.Property<string>("Theme")
+                        .HasMaxLength(2000);
+
+                    b.Property<int?>("UserId");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("LangId");
+
+                    b.HasIndex("UserId")
+                        .IsUnique();
+
+                    b.ToTable("UserSettingses");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Users.SystemRole", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd();
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<string>("DisplayName")
+                        .HasMaxLength(2000);
+
+                    b.Property<string>("Email")
+                        .HasMaxLength(2000);
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("SystemRoles");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Users.SystemRolePermission", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd();
+
+                    b.Property<bool>("CanChangeOtherUsersSystemRole");
+
+                    b.Property<bool>("CanChangeRoles");
+
+                    b.Property<bool>("CanChangeSystemSettings");
+
+                    b.Property<bool>("CanChangeUserData");
+
+                    b.Property<bool>("CanCreateGroups");
+
+                    b.Property<bool>("CanCreateRoles");
+
+                    b.Property<bool>("CanDeleteActivatedUsers");
+
+                    b.Property<bool>("CanDeleteGroups");
+
+                    b.Property<bool>("CanDeleteRoles");
+
+                    b.Property<bool>("CanManageNewUsers");
+
+                    b.Property<bool>("CanManageTags");
+
+                    b.Property<bool>("CanViewDashboard");
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.Property<int>("SystemRoleId");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("SystemRoleId")
+                        .IsUnique();
+
+                    b.ToTable("SystemRolePermissions");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Users.SystemSetting", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd();
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<string>("CurrentServerMessage")
+                        .HasMaxLength(10000);
+
+                    b.Property<int>("CustomProjectTestCompileTimeoutInMs");
+
+                    b.Property<int>("CustomProjectTestMaxDiskSpaceInKb");
+
+                    b.Property<int>("CustomProjectTestMemoryLimitInKb");
+
+                    b.Property<int>("CustomProjectTestTimeoutInMs");
+
+                    b.Property<int>("DefaultGroupCreatorGroupRoleId");
+
+                    b.Property<int>("DefaultGroupRoleId");
+
+                    b.Property<int>("DefaultUserGroupId");
+
+                    b.Property<int>("JustRunProgramCompileTimeoutInMs");
+
+                    b.Property<int>("JustRunProgramMaxDiskSpaceInKb");
+
+                    b.Property<int>("JustRunProgramMemoryLimitInKb");
+
+                    b.Property<int>("JustRunProgramTimeoutInMs");
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.Property<int>("MaxCustomProjectsPerUser");
+
+                    b.Property<int>("MaxCustomTestsPerParticipation");
+
+                    b.Property<int>("MaxNumberOfTestsWithOneRequest");
+
+                    b.Property<int>("MaxNumberOfTestsWithOneRequestSubmitTestServer");
+
+                    b.Property<int>("SubmitTestServerTimeoutInMs");
+
+                    b.Property<string>("SubmitTestServerUrl")
+                        .HasMaxLength(2000);
+
+                    b.Property<string>("TestServerConfigUiUrl")
+                        .HasMaxLength(2000);
+
+                    b.Property<string>("TestServerStatsUrl")
+                        .HasMaxLength(2000);
+
+                    b.Property<int>("TestServerTimeoutInMs");
+
+                    b.Property<string>("TestServerUrl")
+                        .HasMaxLength(2000);
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("DefaultGroupCreatorGroupRoleId")
+                        .IsUnique();
+
+                    b.HasIndex("DefaultGroupRoleId")
+                        .IsUnique();
+
+                    b.HasIndex("DefaultUserGroupId")
+                        .IsUnique();
+
+                    b.ToTable("SystemSettings");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Users.User", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd();
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<string>("Email")
+                        .HasMaxLength(2000);
+
+                    b.Property<string>("FirstName")
+                        .HasMaxLength(2000);
+
+                    b.Property<bool>("IsActivated");
+
+                    b.Property<DateTime>("LastLoginAt");
+
+                    b.Property<string>("LastName")
+                        .HasMaxLength(2000);
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.Property<string>("Password")
+                        .HasMaxLength(2000);
+
+                    b.Property<int?>("SystemRoleId");
+
+                    b.Property<string>("Token")
+                        .IsRequired()
+                        .HasMaxLength(2000);
+
+                    b.HasKey("Id");
+
+                    b.HasAlternateKey("Token")
+                        .HasName("Unique_Token");
+
+                    b.HasIndex("SystemRoleId");
+
+                    b.ToTable("Users");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Users.UserGroup", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd();
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<string>("DisplayName")
+                        .HasMaxLength(2000);
+
+                    b.Property<string>("Email")
+                        .HasMaxLength(2000);
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("UserGroups");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Users.UserWithUserGroup", b =>
+                {
+                    b.Property<int>("UserId");
+
+                    b.Property<int>("UserGroupId");
+
+                    b.Property<DateTime>("CreatedAt");
+
+                    b.Property<int>("GroupRoleId");
+
+                    b.Property<DateTime>("LastUpdatedAt");
+
+                    b.HasKey("UserId", "UserGroupId");
+
+                    b.HasIndex("GroupRoleId");
+
+                    b.HasIndex("UserGroupId");
+
+                    b.HasIndex("UserId");
+
+                    b.ToTable("UserWithUserGroups");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.CustomProjects.CustomProject", b =>
+                {
+                    b.HasOne("ClientServer.Models.Users.User", "User")
+                        .WithMany("CustomProjects")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade);
+                });
+
+            modelBuilder.Entity("ClientServer.Models.CustomProjects.CustomProjectDescription", b =>
+                {
+                    b.HasOne("ClientServer.Models.CustomProjects.CustomProject", "CustomProject")
+                        .WithOne("Description")
+                        .HasForeignKey("ClientServer.Models.CustomProjects.CustomProjectDescription", "CustomProjectId")
+                        .OnDelete(DeleteBehavior.Cascade);
+                });
+
+            modelBuilder.Entity("ClientServer.Models.CustomProjects.CustomProjectDescriptionWithFileAsAssetReference", b =>
+                {
+                    b.HasOne("ClientServer.Models.CustomProjects.CustomProjectDescription", "CustomProjectDescription")
+                        .WithMany("AssetReferences")
+                        .HasForeignKey("CustomProjectDescriptionId")
+                        .OnDelete(DeleteBehavior.Cascade);
+
+                    b.HasOne("ClientServer.Models.Files.FileReferenceUserFileAsset", "FileReferenceUserFileAsset")
+                        .WithMany("CustomProjectDescriptionWithFileAsAssetReferences")
+                        .HasForeignKey("FileReferenceUserFileAssetId")
+                        .OnDelete(DeleteBehavior.Cascade);
+                });
+
+            modelBuilder.Entity("ClientServer.Models.CustomProjects.CustomProjectSolution", b =>
+                {
+                    b.HasOne("ClientServer.Models.CustomProjects.CustomProject", "CustomProject")
+                        .WithMany("Solutions")
+                        .HasForeignKey("CustomProjectId")
+                        .OnDelete(DeleteBehavior.Cascade);
+
+                    b.HasOne("ClientServer.Models.CustomProjects.CustomProjectSolutionFile", "MainFile")
+                        .WithOne()
+                        .HasForeignKey("ClientServer.Models.CustomProjects.CustomProjectSolution", "MainFileId")
+                        .OnDelete(DeleteBehavior.SetNull);
+
+                    b.HasOne("ClientServer.Models.PLang", "PLang")
+                        .WithMany()
+                        .HasForeignKey("PLangId")
+                        .OnDelete(DeleteBehavior.Cascade);
+                });
+
+            modelBuilder.Entity("ClientServer.Models.CustomProjects.CustomProjectSolutionFile", b =>
+                {
+                    b.HasOne("ClientServer.Models.CustomProjects.CustomProjectSolution")
+                        .WithMany("SolutionFiles")
+                        .HasForeignKey("CustomProjectSolutionId")
+                        .OnDelete(DeleteBehavior.Cascade);
+                });
+
+            modelBuilder.Entity("ClientServer.Models.CustomProjects.CustomProjectTest", b =>
+                {
+                    b.HasOne("ClientServer.Models.CustomProjects.CustomProject", "CustomProject")
+                        .WithMany("Tests")
+                        .HasForeignKey("CustomProjectId")
+                        .OnDelete(DeleteBehavior.Cascade);
+
+                    b.HasOne("ClientServer.Models.Exercises.Tests.TestType", "TestType")
+                        .WithMany()
+                        .HasForeignKey("TestTypeId")
+                        .OnDelete(DeleteBehavior.Cascade);
+                });
+
+            modelBuilder.Entity("ClientServer.Models.CustomProjects.CustomProjectTestSettings", b =>
+                {
+                    b.HasOne("ClientServer.Models.CustomProjects.CustomProjectTest", "CustomProjectTest")
+                        .WithOne("CustomProjectTestSettings")
+                        .HasForeignKey("ClientServer.Models.CustomProjects.CustomProjectTestSettings", "CustomProjectTestId")
+                        .OnDelete(DeleteBehavior.Cascade);
+                });
+
+            modelBuilder.Entity("ClientServer.Models.CustomProjects.CustomProjectTestWithFileAsAssetReference", b =>
+                {
+                    b.HasOne("ClientServer.Models.CustomProjects.CustomProjectTest", "CustomProjectTest")
+                        .WithMany("AssetReferences")
+                        .HasForeignKey("CustomProjectTestId")
+                        .OnDelete(DeleteBehavior.Cascade);
+
+                    b.HasOne("ClientServer.Models.Files.FileReferenceUserFileAsset", "FileReferenceUserFileAsset")
+                        .WithMany("CustomProjectTestWithFileAsAssetReferences")
+                        .HasForeignKey("FileReferenceUserFileAssetId")
+                        .OnDelete(DeleteBehavior.Cascade);
+                });
+
+            modelBuilder.Entity("ClientServer.Models.CustomProjects.CustomProjectTestWithSolutionAsTestResult", b =>
+                {
+                    b.HasOne("ClientServer.Models.CustomProjects.CustomProjectSolution", "CustomProjectSolution")
+                        .WithMany("TestResults")
+                        .HasForeignKey("CustomProjectSolutionId")
+                        .OnDelete(DeleteBehavior.Cascade);
+
+                    b.HasOne("ClientServer.Models.CustomProjects.CustomProjectTest", "CustomProjectTest")
+                        .WithMany("TestResults")
+                        .HasForeignKey("CustomProjectTestId")
+                        .OnDelete(DeleteBehavior.Cascade);
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.AfterSolutions.AfterSolution", b =>
+                {
+                    b.HasOne("ClientServer.Models.Exercises.AfterSolutions.AfterSolutionFile", "MainFile")
+                        .WithOne()
+                        .HasForeignKey("ClientServer.Models.Exercises.AfterSolutions.AfterSolution", "MainFileId")
+                        .OnDelete(DeleteBehavior.SetNull);
+
+                    b.HasOne("ClientServer.Models.Exercises.Solution.Solution", "Solution")
+                        .WithOne("AfterSolution")
+                        .HasForeignKey("ClientServer.Models.Exercises.AfterSolutions.AfterSolution", "SolutionUserId", "SolutionExerciseReleaseId", "SolutionPLangId")
+                        .OnDelete(DeleteBehavior.Cascade);
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.AfterSolutions.AfterSolutionFile", b =>
+                {
+                    b.HasOne("ClientServer.Models.Exercises.AfterSolutions.AfterSolution", "AfterSolution")
+                        .WithMany("SolutionFiles")
+                        .HasForeignKey("AfterSolutionId")
+                        .OnDelete(DeleteBehavior.Cascade);
+
+                    b.HasOne("ClientServer.Models.Exercises.TemplateFile", "TemplateFile")
+                        .WithMany()
+                        .HasForeignKey("TemplateFileId");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.AfterSolutions.CustomTestWithAfterSolutionAsTestResult", b =>
+                {
+                    b.HasOne("ClientServer.Models.Exercises.AfterSolutions.AfterSolution", "AfterSolution")
+                        .WithMany("CustomTestResults")
+                        .HasForeignKey("AfterSolutionId")
+                        .OnDelete(DeleteBehavior.Cascade);
+
+                    b.HasOne("ClientServer.Models.Exercises.Tests.CustomTest", "CustomTest")
+                        .WithMany("AfterTestResults")
+                        .HasForeignKey("CustomTestId")
+                        .OnDelete(DeleteBehavior.Cascade);
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.AfterSolutions.TestWithAfterSolutionAsTestResult", b =>
+                {
+                    b.HasOne("ClientServer.Models.Exercises.AfterSolutions.AfterSolution", "AfterSolution")
+                        .WithMany("TestResults")
+                        .HasForeignKey("AfterSolutionId")
+                        .OnDelete(DeleteBehavior.Cascade);
+
+                    b.HasOne("ClientServer.Models.Exercises.Tests.Test", "Test")
+                        .WithMany("AfterTestResults")
+                        .HasForeignKey("TestId")
+                        .OnDelete(DeleteBehavior.Cascade);
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.CodeTemplate", b =>
+                {
+                    b.HasOne("ClientServer.Models.Exercises.Exercise", "Exercise")
+                        .WithMany("CodeTemplates")
+                        .HasForeignKey("ExerciseId")
+                        .OnDelete(DeleteBehavior.Cascade);
+
+                    b.HasOne("ClientServer.Models.Exercises.TemplateFile", "MainFile")
+                        .WithOne()
+                        .HasForeignKey("ClientServer.Models.Exercises.CodeTemplate", "MainFileId")
+                        .OnDelete(DeleteBehavior.SetNull);
+
+                    b.HasOne("ClientServer.Models.PLang", "PLang")
+                        .WithMany()
+                        .HasForeignKey("PLangId");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.CustomTestWithFileAsAssetReference", b =>
+                {
+                    b.HasOne("ClientServer.Models.Exercises.Tests.CustomTest", "CustomTest")
+                        .WithMany("AssetReferences")
+                        .HasForeignKey("CustomTestId")
+                        .OnDelete(DeleteBehavior.Cascade);
+
+                    b.HasOne("ClientServer.Models.Files.FileReferenceUserFileAsset", "FileReferenceUserFileAsset")
+                        .WithMany("CustomTestWithFileAsAssetReferences")
+                        .HasForeignKey("FileReferenceUserFileAssetId")
+                        .OnDelete(DeleteBehavior.Cascade);
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.Exercise", b =>
+                {
+                    b.HasOne("ClientServer.Models.Users.UserGroup", "UserGroup")
+                        .WithMany("Exercises")
+                        .HasForeignKey("UserGroupId")
+                        .OnDelete(DeleteBehavior.Cascade);
+
+                    b.HasOne("ClientServer.Models.Users.User", "User")
+                        .WithMany("Exercises")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.SetNull);
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.ExerciseDescription", b =>
+                {
+                    b.HasOne("ClientServer.Models.Exercises.Exercise", "Exercise")
+                        .WithOne("Description")
+                        .HasForeignKey("ClientServer.Models.Exercises.ExerciseDescription", "ExerciseId")
+                        .OnDelete(DeleteBehavior.Cascade);
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.ExerciseDescriptionWithFileAsAssetReference", b =>
+                {
+                    b.HasOne("ClientServer.Models.Exercises.ExerciseDescription", "ExerciseDescription")
+                        .WithMany("AssetReferences")
+                        .HasForeignKey("ExerciseDescriptionId")
+                        .OnDelete(DeleteBehavior.Cascade);
+
+                    b.HasOne("ClientServer.Models.Files.FileReferenceMarkdownAsset", "FileReferenceMarkdownAsset")
+                        .WithMany("AssetReferences")
+                        .HasForeignKey("FileReferenceMarkdownAssetId")
+                        .OnDelete(DeleteBehavior.Cascade);
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.MetaData", b =>
+                {
+                    b.HasOne("ClientServer.Models.Exercises.Exercise", "Exercise")
+                        .WithOne("MetaData")
+                        .HasForeignKey("ClientServer.Models.Exercises.MetaData", "ExerciseId")
+                        .OnDelete(DeleteBehavior.Cascade);
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.Release.ExerciseRelease", b =>
+                {
+                    b.HasOne("ClientServer.Models.Exercises.Exercise", "Exercise")
+                        .WithMany("Releases")
+                        .HasForeignKey("ExerciseId");
+
+                    b.HasOne("ClientServer.Models.PLang", "PLang")
+                        .WithMany()
+                        .HasForeignKey("PLangId");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.Solution.CustomTestWithSingleSolutionAsTestResult", b =>
+                {
+                    b.HasOne("ClientServer.Models.Exercises.Tests.CustomTest", "CustomTest")
+                        .WithMany("TestResultsNew")
+                        .HasForeignKey("CustomTestId")
+                        .OnDelete(DeleteBehavior.Cascade);
+
+                    b.HasOne("ClientServer.Models.Exercises.Solution.Solution", "Solution")
+                        .WithMany("CustomTestResults")
+                        .HasForeignKey("SolutionUserId", "SolutionExerciseReleaseId", "SolutionPLangId")
+                        .OnDelete(DeleteBehavior.Cascade);
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.Solution.ExerciseReleaseWithUserAsParticipation", b =>
+                {
+                    b.HasOne("ClientServer.Models.Exercises.Release.ExerciseRelease", "ExerciseRelease")
+                        .WithMany("ExerciseReleaseWithUserAsParticipations")
+                        .HasForeignKey("ExerciseReleaseId")
+                        .OnDelete(DeleteBehavior.Cascade);
+
+                    b.HasOne("ClientServer.Models.PLang", "LastEditedPLang")
+                        .WithMany()
+                        .HasForeignKey("LastEditedPLangId");
+
+                    b.HasOne("ClientServer.Models.Users.User", "User")
+                        .WithMany("ExerciseReleaseWithUserAsParticipations")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade);
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.Solution.Solution", b =>
+                {
+                    b.HasOne("ClientServer.Models.Exercises.Solution.SolutionFile", "MainFile")
+                        .WithOne()
+                        .HasForeignKey("ClientServer.Models.Exercises.Solution.Solution", "MainFileId")
+                        .OnDelete(DeleteBehavior.SetNull);
+
+                    b.HasOne("ClientServer.Models.PLang", "PLang")
+                        .WithMany()
+                        .HasForeignKey("PLangId");
+
+                    b.HasOne("ClientServer.Models.Exercises.Solution.ExerciseReleaseWithUserAsParticipation", "ExerciseReleaseWithUserAsParticipation")
+                        .WithMany("Solutions")
+                        .HasForeignKey("UserId", "ExerciseReleaseId")
+                        .OnDelete(DeleteBehavior.Cascade);
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.Solution.SolutionAssessment", b =>
+                {
+                    b.HasOne("ClientServer.Models.Exercises.Solution.Solution", "Solution")
+                        .WithOne("Assessment")
+                        .HasForeignKey("ClientServer.Models.Exercises.Solution.SolutionAssessment", "UserId", "ExerciseReleaseId", "PLangId")
+                        .OnDelete(DeleteBehavior.Cascade);
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.Solution.SolutionFile", b =>
+                {
+                    b.HasOne("ClientServer.Models.Exercises.TemplateFile", "TemplateFile")
+                        .WithMany("SolutionParts")
+                        .HasForeignKey("TemplateFileId")
+                        .OnDelete(DeleteBehavior.SetNull);
+
+                    b.HasOne("ClientServer.Models.Exercises.Solution.Solution", "Solution")
+                        .WithMany("SolutionFiles")
+                        .HasForeignKey("SolutionUserId", "SolutionExerciseReleaseId", "SolutionPLangId")
+                        .OnDelete(DeleteBehavior.Cascade);
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.Solution.TestWithSingleSolutionAsTestResult", b =>
+                {
+                    b.HasOne("ClientServer.Models.Exercises.Tests.Test", "Test")
+                        .WithMany("TestResultsNew")
+                        .HasForeignKey("TestId")
+                        .OnDelete(DeleteBehavior.Cascade);
+
+                    b.HasOne("ClientServer.Models.Exercises.Solution.Solution", "Solution")
+                        .WithMany("TestResults")
+                        .HasForeignKey("SolutionUserId", "SolutionExerciseReleaseId", "SolutionPLangId")
+                        .OnDelete(DeleteBehavior.Cascade);
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.TagWithMetaData", b =>
+                {
+                    b.HasOne("ClientServer.Models.Exercises.MetaData", "MetaData")
+                        .WithMany("TagWithMetaDatas")
+                        .HasForeignKey("MetaDataId")
+                        .OnDelete(DeleteBehavior.Cascade);
+
+                    b.HasOne("ClientServer.Models.Exercises.Tag", "Tag")
+                        .WithMany()
+                        .HasForeignKey("TagId")
+                        .OnDelete(DeleteBehavior.Cascade);
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.TemplateFile", b =>
+                {
+                    b.HasOne("ClientServer.Models.Exercises.CodeTemplate")
+                        .WithMany("TemplateFiles")
+                        .HasForeignKey("CodeTemplateId")
+                        .OnDelete(DeleteBehavior.Cascade);
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.Tests.CustomTest", b =>
+                {
+                    b.HasOne("ClientServer.Models.Exercises.Tests.TestType", "TestType")
+                        .WithMany()
+                        .HasForeignKey("TestTypeId")
+                        .OnDelete(DeleteBehavior.Cascade);
+
+                    b.HasOne("ClientServer.Models.Exercises.Solution.ExerciseReleaseWithUserAsParticipation")
+                        .WithMany("CustomTests")
+                        .HasForeignKey("UserId", "ExerciseReleaseId")
+                        .OnDelete(DeleteBehavior.Cascade);
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.Tests.DefaultCustomTestSettings", b =>
+                {
+                    b.HasOne("ClientServer.Models.Exercises.Exercise", "Exercise")
+                        .WithOne("DefaultCustomTestSettings")
+                        .HasForeignKey("ClientServer.Models.Exercises.Tests.DefaultCustomTestSettings", "ExerciseId")
+                        .OnDelete(DeleteBehavior.Cascade);
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.Tests.Test", b =>
+                {
+                    b.HasOne("ClientServer.Models.Exercises.Exercise", "Exercise")
+                        .WithMany("Tests")
+                        .HasForeignKey("ExerciseId")
+                        .OnDelete(DeleteBehavior.Cascade);
+
+                    b.HasOne("ClientServer.Models.Exercises.Tests.TestType", "TestType")
+                        .WithMany()
+                        .HasForeignKey("TestTypeId");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.Tests.TestSettings", b =>
+                {
+                    b.HasOne("ClientServer.Models.Exercises.Tests.Test", "Test")
+                        .WithOne("TestSettings")
+                        .HasForeignKey("ClientServer.Models.Exercises.Tests.TestSettings", "TestId")
+                        .OnDelete(DeleteBehavior.Cascade);
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Exercises.TestWithFileAsAssetReference", b =>
+                {
+                    b.HasOne("ClientServer.Models.Files.FileReferenceTestAsset", "FileReferenceTestAsset")
+                        .WithMany("AssetReferences")
+                        .HasForeignKey("FileReferenceTestAssetId")
+                        .OnDelete(DeleteBehavior.Cascade);
+
+                    b.HasOne("ClientServer.Models.Exercises.Tests.Test", "Test")
+                        .WithMany("AssetReferences")
+                        .HasForeignKey("TestId")
+                        .OnDelete(DeleteBehavior.Cascade);
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Users.AuthToken", b =>
+                {
+                    b.HasOne("ClientServer.Models.Users.User", "User")
+                        .WithOne()
+                        .HasForeignKey("ClientServer.Models.Users.AuthToken", "UserId")
+                        .OnDelete(DeleteBehavior.Cascade);
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Users.ExternalUser", b =>
+                {
+                    b.HasOne("ClientServer.Models.Users.User", "User")
+                        .WithOne("ExternalUser")
+                        .HasForeignKey("ClientServer.Models.Users.ExternalUser", "UserId")
+                        .OnDelete(DeleteBehavior.Cascade);
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Users.GroupRolePermission", b =>
+                {
+                    b.HasOne("ClientServer.Models.Users.GroupRole", "GroupRole")
+                        .WithOne("GroupRolePermission")
+                        .HasForeignKey("ClientServer.Models.Users.GroupRolePermission", "GroupRoleId")
+                        .OnDelete(DeleteBehavior.Cascade);
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Users.Settings.CodeEditorSetting", b =>
+                {
+                    b.HasOne("ClientServer.Models.Users.Settings.UserSetting", "UserSetting")
+                        .WithOne("CodeEditorSetting")
+                        .HasForeignKey("ClientServer.Models.Users.Settings.CodeEditorSetting", "UserSettingId")
+                        .OnDelete(DeleteBehavior.Cascade);
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Users.Settings.UserSetting", b =>
+                {
+                    b.HasOne("ClientServer.Models.Lang", "Lang")
+                        .WithMany()
+                        .HasForeignKey("LangId")
+                        .OnDelete(DeleteBehavior.SetNull);
+
+                    b.HasOne("ClientServer.Models.Users.User", "User")
+                        .WithOne("UserSettings")
+                        .HasForeignKey("ClientServer.Models.Users.Settings.UserSetting", "UserId")
+                        .OnDelete(DeleteBehavior.Cascade);
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Users.SystemRolePermission", b =>
+                {
+                    b.HasOne("ClientServer.Models.Users.SystemRole", "SystemRole")
+                        .WithOne("SystemRolePermission")
+                        .HasForeignKey("ClientServer.Models.Users.SystemRolePermission", "SystemRoleId")
+                        .OnDelete(DeleteBehavior.Cascade);
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Users.SystemSetting", b =>
+                {
+                    b.HasOne("ClientServer.Models.Users.GroupRole", "DefaultGroupCreatorGroupRole")
+                        .WithOne()
+                        .HasForeignKey("ClientServer.Models.Users.SystemSetting", "DefaultGroupCreatorGroupRoleId");
+
+                    b.HasOne("ClientServer.Models.Users.GroupRole", "DefaultGroupRole")
+                        .WithOne()
+                        .HasForeignKey("ClientServer.Models.Users.SystemSetting", "DefaultGroupRoleId");
+
+                    b.HasOne("ClientServer.Models.Users.UserGroup", "DefaultUserGroup")
+                        .WithOne()
+                        .HasForeignKey("ClientServer.Models.Users.SystemSetting", "DefaultUserGroupId");
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Users.User", b =>
+                {
+                    b.HasOne("ClientServer.Models.Users.SystemRole", "SystemRole")
+                        .WithMany()
+                        .HasForeignKey("SystemRoleId")
+                        .OnDelete(DeleteBehavior.SetNull);
+                });
+
+            modelBuilder.Entity("ClientServer.Models.Users.UserWithUserGroup", b =>
+                {
+                    b.HasOne("ClientServer.Models.Users.GroupRole", "GroupRole")
+                        .WithMany("UserUserGroups")
+                        .HasForeignKey("GroupRoleId");
+
+                    b.HasOne("ClientServer.Models.Users.UserGroup", "UserGroup")
+                        .WithMany("UserWithUserGroups")
+                        .HasForeignKey("UserGroupId")
+                        .OnDelete(DeleteBehavior.Cascade);
+
+                    b.HasOne("ClientServer.Models.Users.User", "User")
+                        .WithMany("UserWithUserGroups")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade);
+                });
+        }
+    }
+}
diff --git a/src/ClientServer/Migrations/20190830142059_EnsureNoReleaseDeleteEx.cs b/src/ClientServer/Migrations/20190830142059_EnsureNoReleaseDeleteEx.cs
new file mode 100755
index 0000000..b11a714
--- /dev/null
+++ b/src/ClientServer/Migrations/20190830142059_EnsureNoReleaseDeleteEx.cs
@@ -0,0 +1,39 @@
+using System;
+using System.Collections.Generic;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+namespace ClientServer.Migrations
+{
+    public partial class EnsureNoReleaseDeleteEx : Migration
+    {
+        protected override void Up(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropForeignKey(
+                name: "FK_ExerciseReleases_Exercises_ExerciseId",
+                table: "ExerciseReleases");
+
+            migrationBuilder.AddForeignKey(
+                name: "FK_ExerciseReleases_Exercises_ExerciseId",
+                table: "ExerciseReleases",
+                column: "ExerciseId",
+                principalTable: "Exercises",
+                principalColumn: "Id",
+                onDelete: ReferentialAction.Restrict);
+        }
+
+        protected override void Down(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropForeignKey(
+                name: "FK_ExerciseReleases_Exercises_ExerciseId",
+                table: "ExerciseReleases");
+
+            migrationBuilder.AddForeignKey(
+                name: "FK_ExerciseReleases_Exercises_ExerciseId",
+                table: "ExerciseReleases",
+                column: "ExerciseId",
+                principalTable: "Exercises",
+                principalColumn: "Id",
+                onDelete: ReferentialAction.Cascade);
+        }
+    }
+}
diff --git a/src/ClientServer/Migrations/YapexDbContextModelSnapshot.cs b/src/ClientServer/Migrations/YapexDbContextModelSnapshot.cs
index ba905ac..aed1841 100755
--- a/src/ClientServer/Migrations/YapexDbContextModelSnapshot.cs
+++ b/src/ClientServer/Migrations/YapexDbContextModelSnapshot.cs
@@ -4,6 +4,7 @@ using Microsoft.EntityFrameworkCore.Infrastructure;
 using Microsoft.EntityFrameworkCore.Metadata;
 using Microsoft.EntityFrameworkCore.Migrations;
 using ClientServer.Db;
+using ClientServer.Models.Exercises.Release;
 
 namespace ClientServer.Migrations
 {
@@ -1900,8 +1901,7 @@ namespace ClientServer.Migrations
                 {
                     b.HasOne("ClientServer.Models.Exercises.Exercise", "Exercise")
                         .WithMany("Releases")
-                        .HasForeignKey("ExerciseId")
-                        .OnDelete(DeleteBehavior.Cascade);
+                        .HasForeignKey("ExerciseId");
 
                     b.HasOne("ClientServer.Models.PLang", "PLang")
                         .WithMany()
-- 
GitLab