From 6ebcb6d696515553f5bfa5f61609243e4627eef4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Janis=20Daniel=20Da=CC=88hne?=
 <janis.daehne2@student.uni-halle.de>
Date: Thu, 1 Aug 2019 17:55:10 +0200
Subject: [PATCH] - migrate wrong fk MAYBE step2

---
 .../EditCustomProjectController.cs            |   44 +-
 src/ClientServer/Controllers/Core/Init.cs     |   64 +-
 .../Core/Testing/TestingController.cs         |    2 +-
 src/ClientServer/Db/YapexDbContext.cs         |   38 +-
 ...37_addFakeFksToOtherSidesStep2.Designer.cs | 2163 +++++++++++++++++
 ...90801154937_addFakeFksToOtherSidesStep2.cs |  358 +++
 .../Migrations/YapexDbContextModelSnapshot.cs |  118 +-
 .../CustomProjects/CustomProjectTest.cs       |    3 +-
 .../CustomProjectTestSettings.cs              |    2 +-
 .../Models/Exercises/Solution/Solution.cs     |    5 -
 .../Models/Exercises/Tests/Test.cs            |    1 -
 .../Models/Exercises/Tests/TestSettings.cs    |    2 +-
 src/ClientServer/Models/Interfaces/AllTest.cs |    2 +-
 src/ClientServer/Models/Users/GroupRole.cs    |    4 +-
 .../Models/Users/GroupRolePermission.cs       |    2 +-
 .../Users/Settings/CodeEditorSettings.cs      |    2 +-
 .../Models/Users/Settings/UserSetting.cs      |    1 -
 src/ClientServer/Models/Users/SystemRole.cs   |    2 -
 .../Models/Users/SystemRolePermission.cs      |    2 +-
 src/ClientServer/appsettings.json             |    4 +-
 20 files changed, 2679 insertions(+), 140 deletions(-)
 create mode 100755 src/ClientServer/Migrations/20190801154937_addFakeFksToOtherSidesStep2.Designer.cs
 create mode 100755 src/ClientServer/Migrations/20190801154937_addFakeFksToOtherSidesStep2.cs

diff --git a/src/ClientServer/Controllers/Core/CustomProjects/EditCustomProjectController.cs b/src/ClientServer/Controllers/Core/CustomProjects/EditCustomProjectController.cs
index 182002a..5871e29 100644
--- a/src/ClientServer/Controllers/Core/CustomProjects/EditCustomProjectController.cs
+++ b/src/ClientServer/Controllers/Core/CustomProjects/EditCustomProjectController.cs
@@ -42,7 +42,7 @@ namespace ClientServer.Controllers.Core.customProjects
                     .ThenInclude(p => p.AssetReferences)
                     .ThenInclude(p => p.FileReferenceUserFileAsset)
                     .Include(p => p.Tests)
-                    .ThenInclude(p => p.TestSettings)
+                    .ThenInclude(p => p.CustomProjectTestSettings)
                     .Include(p => p.Tests)
                     .FirstOrDefaultAsync()
                 ;
@@ -130,12 +130,12 @@ namespace ClientServer.Controllers.Core.customProjects
                     }).ToList(),
                     TestSettings = new TestSettingsFullBase()
                     {
-                        Id = p.TestSettings.Id,
-                        MaxDiskSpaceInKb = p.TestSettings.MaxDiskSpaceInKb,
-                        MemoryLimitInKb = p.TestSettings.MemoryLimitInKb,
-                        TimeoutInMs = p.TestSettings.TimeoutInMs,
-                        CompileTimeoutInMs = p.TestSettings.CompileTimeoutInMs,
-                        CompilerOptions = p.TestSettings.CompilerOptions,
+                        Id = p.CustomProjectTestSettings.Id,
+                        MaxDiskSpaceInKb = p.CustomProjectTestSettings.MaxDiskSpaceInKb,
+                        MemoryLimitInKb = p.CustomProjectTestSettings.MemoryLimitInKb,
+                        TimeoutInMs = p.CustomProjectTestSettings.TimeoutInMs,
+                        CompileTimeoutInMs = p.CustomProjectTestSettings.CompileTimeoutInMs,
+                        CompilerOptions = p.CustomProjectTestSettings.CompilerOptions,
                     }
                 }).ToList()
             };
@@ -329,7 +329,7 @@ namespace ClientServer.Controllers.Core.customProjects
                     DisplayName = test.DisplayName,
                     TestTypeId = testType.Id,
                     Weight = test.Weight,
-                    TestSettings = new TestSettings()
+                    CustomProjectTestSettings = new CustomProjectTestSettings()
                     {
                         MemoryLimitInKb = test.TestSettings.MemoryLimitInKb,
                         TimeoutInMs = test.TestSettings.TimeoutInMs,
@@ -774,7 +774,7 @@ namespace ClientServer.Controllers.Core.customProjects
                 TestType = testType,
                 Weight = testFullBase.Weight,
                 //CustomProjectId =  customProjectId //TODO needed?
-                TestSettings = new TestSettings()
+                CustomProjectTestSettings = new CustomProjectTestSettings()
                 {
                     MaxDiskSpaceInKb = testFullBase.TestSettings.MaxDiskSpaceInKb,
                     MemoryLimitInKb = testFullBase.TestSettings.MemoryLimitInKb,
@@ -810,10 +810,10 @@ namespace ClientServer.Controllers.Core.customProjects
                 Files = new List<FilePreviewFromBackend>(),
                 TestSettings = new TestSettingsFullBase()
                 {
-                    Id = newTest.TestSettings.Id,
-                    MaxDiskSpaceInKb = newTest.TestSettings.MaxDiskSpaceInKb,
-                    MemoryLimitInKb = newTest.TestSettings.MemoryLimitInKb,
-                    TimeoutInMs = newTest.TestSettings.TimeoutInMs,
+                    Id = newTest.CustomProjectTestSettings.Id,
+                    MaxDiskSpaceInKb = newTest.CustomProjectTestSettings.MaxDiskSpaceInKb,
+                    MemoryLimitInKb = newTest.CustomProjectTestSettings.MemoryLimitInKb,
+                    TimeoutInMs = newTest.CustomProjectTestSettings.TimeoutInMs,
                     CompileTimeoutInMs = testFullBase.TestSettings.CompileTimeoutInMs,
                     CompilerOptions = testFullBase.TestSettings.CompilerOptions,
                 }
@@ -866,7 +866,7 @@ namespace ClientServer.Controllers.Core.customProjects
             var oldTest = await _context.CustomProjectTests
                     .Where(p =>
                         p.Id == testFullBase.Id && p.CustomProjectId == customProjectId)
-                    .Include(p => p.TestSettings)
+                    .Include(p => p.CustomProjectTestSettings)
                     .Include(p => p.TestResults)
                     .Include(p => p.AssetReferences)
                     .ThenInclude(p => p.FileReferenceUserFileAsset)
@@ -888,10 +888,10 @@ namespace ClientServer.Controllers.Core.customProjects
 
             oldTest.TestType = testType;
 
-            oldTest.TestSettings.MaxDiskSpaceInKb = testFullBase.TestSettings.MaxDiskSpaceInKb;
-            oldTest.TestSettings.MemoryLimitInKb = testFullBase.TestSettings.MemoryLimitInKb;
-            oldTest.TestSettings.TimeoutInMs = testFullBase.TestSettings.TimeoutInMs;
-            oldTest.TestSettings.CompilerOptions = testFullBase.TestSettings.CompilerOptions;
+            oldTest.CustomProjectTestSettings.MaxDiskSpaceInKb = testFullBase.TestSettings.MaxDiskSpaceInKb;
+            oldTest.CustomProjectTestSettings.MemoryLimitInKb = testFullBase.TestSettings.MemoryLimitInKb;
+            oldTest.CustomProjectTestSettings.TimeoutInMs = testFullBase.TestSettings.TimeoutInMs;
+            oldTest.CustomProjectTestSettings.CompilerOptions = testFullBase.TestSettings.CompilerOptions;
 
             //assets are managed separately
 
@@ -927,10 +927,10 @@ namespace ClientServer.Controllers.Core.customProjects
                 }).ToList(),
                 TestSettings = new TestSettingsFullBase()
                 {
-                    Id = oldTest.TestSettings.Id,
-                    MaxDiskSpaceInKb = oldTest.TestSettings.MaxDiskSpaceInKb,
-                    MemoryLimitInKb = oldTest.TestSettings.MemoryLimitInKb,
-                    TimeoutInMs = oldTest.TestSettings.TimeoutInMs,
+                    Id = oldTest.CustomProjectTestSettings.Id,
+                    MaxDiskSpaceInKb = oldTest.CustomProjectTestSettings.MaxDiskSpaceInKb,
+                    MemoryLimitInKb = oldTest.CustomProjectTestSettings.MemoryLimitInKb,
+                    TimeoutInMs = oldTest.CustomProjectTestSettings.TimeoutInMs,
                     CompileTimeoutInMs = testFullBase.TestSettings.CompileTimeoutInMs,
                     CompilerOptions = testFullBase.TestSettings.CompilerOptions,
                 }
diff --git a/src/ClientServer/Controllers/Core/Init.cs b/src/ClientServer/Controllers/Core/Init.cs
index 3b7214a..ef8f762 100644
--- a/src/ClientServer/Controllers/Core/Init.cs
+++ b/src/ClientServer/Controllers/Core/Init.cs
@@ -3,7 +3,6 @@ using System.Collections;
 using System.Collections.Generic;
 using System.IO;
 using System.Linq;
-using System.Security.Cryptography;
 using ClientServer.Db;
 using ClientServer.Helpers;
 using ClientServer.Models;
@@ -363,9 +362,8 @@ namespace ClientServer.Controllers.Core
             var allTestSettings = _context.TestCaseSettingses.ToList();
 
 
-            
             var allValidTestSettingsIds = new List<int>();
-            
+
             var exTests = _context.Tests
                     .Include(p => p.TestSettings)
                     .ToList()
@@ -380,7 +378,7 @@ namespace ClientServer.Controllers.Core
             //we need to delete the old test settings... BUT it has on delete cascade
             //so first migrate then drop the constraint and then remove the old test settings...
             var customProjectTests = _context.CustomProjectTests
-                .Include(p => p.TestSettings)
+                .Include(p => p.CustomProjectTestSettings)
                 .ToList();
 
 
@@ -388,28 +386,27 @@ namespace ClientServer.Controllers.Core
             {
                 var customProjectTestSettings = new CustomProjectTestSettings()
                 {
-                    Id = customProjectTest.TestSettings.Id,
-                    CompileTimeoutInMs = customProjectTest.TestSettings.CompileTimeoutInMs,
-                    CompilerOptions = customProjectTest.TestSettings.CompilerOptions,
-                    TimeoutInMs = customProjectTest.TestSettings.TimeoutInMs,
-                    MemoryLimitInKb = customProjectTest.TestSettings.MemoryLimitInKb,
-                    MaxDiskSpaceInKb = customProjectTest.TestSettings.MaxDiskSpaceInKb,
+                    Id = customProjectTest.CustomProjectTestSettings.Id,
+                    CompileTimeoutInMs = customProjectTest.CustomProjectTestSettings.CompileTimeoutInMs,
+                    CompilerOptions = customProjectTest.CustomProjectTestSettings.CompilerOptions,
+                    TimeoutInMs = customProjectTest.CustomProjectTestSettings.TimeoutInMs,
+                    MemoryLimitInKb = customProjectTest.CustomProjectTestSettings.MemoryLimitInKb,
+                    MaxDiskSpaceInKb = customProjectTest.CustomProjectTestSettings.MaxDiskSpaceInKb,
                     CustomProjectTestId = customProjectTest.Id
                 };
 
                 _context.CustomProjectTestSettings.Add(customProjectTestSettings);
-                allValidTestSettingsIds.Add(customProjectTest.TestSettings.Id);
+                allValidTestSettingsIds.Add(customProjectTest.CustomProjectTestSettings.Id);
             }
 
 
             var count1 = exTests.Count + customProjectTests.Count;
             var removedCount = 0;
-            
-            
+
+
             //because we have the delete cascade on the wrong side... we never delete test settings...
             foreach (var allTestSetting in allTestSettings)
             {
-
                 if (allValidTestSettingsIds.Contains(allTestSetting.Id))
                 {
                     //valid
@@ -442,9 +439,40 @@ namespace ClientServer.Controllers.Core
 
             Response.WriteAsync("OK -" + rows);
         }
-        
-        //remove test case settings fk on delete cascade... because when we add the new CustomProjectTestSettings we want to delete the old 
-        
-       
+
+        //remove test case settings fk on delete cascade... because when we add the new CustomProjectTestSettings we want to delete the old
+
+        //remove the old test settings where we created a new CustomProjectTestSettings for (testId is 0) 
+
+        [HttpGet("migrate/step2")]
+        public void MigrateMarkdownFiles2()
+        {
+            var allTestSettings = _context.TestCaseSettingses
+                .Where(p => p.TestId == 0)
+                .ToList();
+            
+            _context.TestCaseSettingses.RemoveRange(allTestSettings);
+
+            var notDeletedAssessments = _context.SolutionAssessment
+                .Where(p => p.UserId == 0 && p.ExerciseReleaseId == 0 && p.PLangId == 0)
+                .ToList();
+            
+            
+            _context.SolutionAssessment.RemoveRange(notDeletedAssessments);
+            
+
+            int rows;
+            try
+            {
+                rows = _context.SaveChanges();
+            }
+            catch (Exception e)
+            {
+                Console.WriteLine(e);
+                throw;
+            }
+
+            Response.WriteAsync("OK -" + rows);
+        }
     }
 }
diff --git a/src/ClientServer/Controllers/Core/Testing/TestingController.cs b/src/ClientServer/Controllers/Core/Testing/TestingController.cs
index bcd0941..88eb480 100644
--- a/src/ClientServer/Controllers/Core/Testing/TestingController.cs
+++ b/src/ClientServer/Controllers/Core/Testing/TestingController.cs
@@ -2371,7 +2371,7 @@ namespace ClientServer.Controllers.Core.Testing
             
 
             var tests = await _context.CustomProjectTests
-                    .Include(p => p.TestSettings)
+                    .Include(p => p.CustomProjectTestSettings)
                     .Include(p => p.TestType)
                     .Include(p => p.AssetReferences)
                     .ThenInclude(p => p.FileReferenceUserFileAsset)
diff --git a/src/ClientServer/Db/YapexDbContext.cs b/src/ClientServer/Db/YapexDbContext.cs
index 88862aa..a5693a3 100644
--- a/src/ClientServer/Db/YapexDbContext.cs
+++ b/src/ClientServer/Db/YapexDbContext.cs
@@ -76,6 +76,7 @@ namespace ClientServer.Db
         public DbSet<ExerciseRelease> ExerciseReleases { get; set; }
 
         public DbSet<Solution> Solutions { get; set; }
+        public DbSet<SolutionAssessment> SolutionAssessment { get; set; }
         public DbSet<SolutionFile> SolutionFiles { get; set; }
         
         public DbSet<TestWithSingleSolutionAsTestResult> TestWithSingleSolutionAsTestResult { get; set; }
@@ -171,6 +172,7 @@ namespace ClientServer.Db
             
             typeof(ExerciseRelease),
             typeof(Solution),
+            typeof(SolutionAssessment),
             typeof(SolutionFile),
             typeof(TestWithSingleSolutionAsTestResult),
             typeof(ExerciseReleaseWithUserAsParticipation),
@@ -284,15 +286,17 @@ namespace ClientServer.Db
 
             #endregion
 
-            //fk wrong side
             m.Entity<CustomProjectTest>()
-                .HasOne(p => p.TestSettings)
-                .WithOne()
-                .HasForeignKey<CustomProjectTest>(p => p.TestSettingsId)
+                .HasOne(p => p.CustomProjectTestSettings)
+                .WithOne(p => p.CustomProjectTest)
+                .HasForeignKey<CustomProjectTestSettings>(p => p.CustomProjectTestId)
                 .IsRequired()
                 .OnDelete(DeleteBehavior.Cascade)
                 ;
 
+            m.Entity<CustomProjectTestSettings>()
+                .HasKey(p => p.Id);
+
 
             #region custom project test asset references join table
 
@@ -545,11 +549,10 @@ namespace ClientServer.Db
             
             #endregion
 
-            //fk wrong side 
             m.Entity<Test>()
                 .HasOne(p => p.TestSettings)
-                .WithOne()
-                .HasForeignKey<Test>(p => p.TestSettingsId)
+                .WithOne(p => p.Test)
+                .HasForeignKey<TestSettings>(p => p.TestId)
                 .IsRequired()
                 .OnDelete(DeleteBehavior.Cascade)
                 ;
@@ -705,7 +708,6 @@ namespace ClientServer.Db
             #endregion
 
             //assessment
-            //TODO not needed??
             m.Entity<SolutionAssessment>()
                 .HasOne(p => p.Solution)
                 .WithOne(p => p.Assessment)
@@ -713,12 +715,11 @@ namespace ClientServer.Db
                 .OnDelete(DeleteBehavior.SetNull)
                 ;
 
-            //fk wrong side 
             m.Entity<Solution>()
                 .HasOne(p => p.Assessment)
                 .WithOne(p => p.Solution)
-                .HasForeignKey<Solution>(p => p.AssessmentId) //added
-                .IsRequired(false)
+                .HasForeignKey<SolutionAssessment>(p => new {p.UserId, p.ExerciseReleaseId, p.PLangId}) //added
+                .IsRequired()
                 .OnDelete(DeleteBehavior.Cascade)
                 ;
 
@@ -967,11 +968,10 @@ namespace ClientServer.Db
 
             #region user settings
 
-            //fk wrong side 
             m.Entity<UserSetting>()
               .HasOne(p => p.CodeEditorSetting)
-              .WithOne()
-              .HasForeignKey<UserSetting>(p => p.CodeEditorSettingsId)
+              .WithOne(p => p.UserSetting)
+              .HasForeignKey<CodeEditorSetting>(p => p.UserSettingId)
               .IsRequired()
               .OnDelete(DeleteBehavior.Cascade)
               ;
@@ -1070,11 +1070,10 @@ namespace ClientServer.Db
                .OnDelete(DeleteBehavior.Restrict)
                ;
 
-            //fk wrong side 
             m.Entity<GroupRole>()
                 .HasOne(p => p.GroupRolePermission)
-                .WithOne()
-                .HasForeignKey<GroupRole>(p => p.GroupRolePermissionId)
+                .WithOne(p => p.GroupRole)
+                .HasForeignKey<GroupRolePermission>(p => p.GroupRoleId)
                 .IsRequired()
                 .OnDelete(DeleteBehavior.Cascade)
                 ;
@@ -1091,11 +1090,10 @@ namespace ClientServer.Db
                 .OnDelete(DeleteBehavior.SetNull) //when we delete a system role we downgrade all users with this role
                 ;
 
-            //fk wrong side 
             m.Entity<SystemRole>()
                 .HasOne(p => p.SystemRolePermission)
-                .WithOne()
-                .HasForeignKey<SystemRole>(p => p.SystemRolePermissionId)
+                .WithOne(p => p.SystemRole)
+                .HasForeignKey<SystemRolePermission>(p => p.SystemRoleId)
                 .IsRequired()
                 .OnDelete(DeleteBehavior.Cascade)
                 ;
diff --git a/src/ClientServer/Migrations/20190801154937_addFakeFksToOtherSidesStep2.Designer.cs b/src/ClientServer/Migrations/20190801154937_addFakeFksToOtherSidesStep2.Designer.cs
new file mode 100755
index 0000000..c184c37
--- /dev/null
+++ b/src/ClientServer/Migrations/20190801154937_addFakeFksToOtherSidesStep2.Designer.cs
@@ -0,0 +1,2163 @@
+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("20190801154937_addFakeFksToOtherSidesStep2")]
+    partial class addFakeFksToOtherSidesStep2
+    {
+        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")
+                        .OnDelete(DeleteBehavior.Cascade);
+
+                    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/20190801154937_addFakeFksToOtherSidesStep2.cs b/src/ClientServer/Migrations/20190801154937_addFakeFksToOtherSidesStep2.cs
new file mode 100755
index 0000000..50fcdf0
--- /dev/null
+++ b/src/ClientServer/Migrations/20190801154937_addFakeFksToOtherSidesStep2.cs
@@ -0,0 +1,358 @@
+using System;
+using System.Collections.Generic;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+namespace ClientServer.Migrations
+{
+    public partial class addFakeFksToOtherSidesStep2 : Migration
+    {
+        protected override void Up(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropForeignKey(
+                name: "FK_CustomProjectTests_TestCaseSettingses_TestSettingsId",
+                table: "CustomProjectTests");
+
+            migrationBuilder.DropForeignKey(
+                name: "FK_Solutions_SolutionAssessment_AssessmentId",
+                table: "Solutions");
+
+            migrationBuilder.DropForeignKey(
+                name: "FK_Tests_TestCaseSettingses_TestSettingsId",
+                table: "Tests");
+
+            migrationBuilder.DropForeignKey(
+                name: "FK_GroupRoles_GroupRolePermissions_GroupRolePermissionId",
+                table: "GroupRoles");
+
+            migrationBuilder.DropForeignKey(
+                name: "FK_UserSettingses_CodeEditorSettings_CodeEditorSettingsId",
+                table: "UserSettingses");
+
+            migrationBuilder.DropForeignKey(
+                name: "FK_SystemRoles_SystemRolePermissions_SystemRolePermissionId",
+                table: "SystemRoles");
+
+            migrationBuilder.DropIndex(
+                name: "IX_SystemRoles_SystemRolePermissionId",
+                table: "SystemRoles");
+
+            migrationBuilder.DropIndex(
+                name: "IX_UserSettingses_CodeEditorSettingsId",
+                table: "UserSettingses");
+
+            migrationBuilder.DropIndex(
+                name: "IX_GroupRoles_GroupRolePermissionId",
+                table: "GroupRoles");
+
+            migrationBuilder.DropIndex(
+                name: "IX_Tests_TestSettingsId",
+                table: "Tests");
+
+            migrationBuilder.DropIndex(
+                name: "IX_Solutions_AssessmentId",
+                table: "Solutions");
+
+            migrationBuilder.DropIndex(
+                name: "IX_CustomProjectTests_TestSettingsId",
+                table: "CustomProjectTests");
+
+            migrationBuilder.DropColumn(
+                name: "SystemRolePermissionId",
+                table: "SystemRoles");
+
+            migrationBuilder.DropColumn(
+                name: "CodeEditorSettingsId",
+                table: "UserSettingses");
+
+            migrationBuilder.DropColumn(
+                name: "GroupRolePermissionId",
+                table: "GroupRoles");
+
+            migrationBuilder.DropColumn(
+                name: "TestSettingsId",
+                table: "Tests");
+
+            migrationBuilder.DropColumn(
+                name: "AssessmentId",
+                table: "Solutions");
+
+            migrationBuilder.DropColumn(
+                name: "TestSettingsId",
+                table: "CustomProjectTests");
+
+            migrationBuilder.AddColumn<DateTime>(
+                name: "CreatedAt",
+                table: "SolutionAssessment",
+                nullable: false,
+                defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified));
+
+            migrationBuilder.AddColumn<DateTime>(
+                name: "LastUpdatedAt",
+                table: "SolutionAssessment",
+                nullable: false,
+                defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified));
+
+            migrationBuilder.CreateIndex(
+                name: "IX_SystemRolePermissions_SystemRoleId",
+                table: "SystemRolePermissions",
+                column: "SystemRoleId",
+                unique: true);
+
+            migrationBuilder.CreateIndex(
+                name: "IX_CodeEditorSettings_UserSettingId",
+                table: "CodeEditorSettings",
+                column: "UserSettingId",
+                unique: true);
+
+            migrationBuilder.CreateIndex(
+                name: "IX_GroupRolePermissions_GroupRoleId",
+                table: "GroupRolePermissions",
+                column: "GroupRoleId",
+                unique: true);
+
+            migrationBuilder.CreateIndex(
+                name: "IX_TestCaseSettingses_TestId",
+                table: "TestCaseSettingses",
+                column: "TestId",
+                unique: true);
+
+            migrationBuilder.CreateIndex(
+                name: "IX_SolutionAssessment_UserId_ExerciseReleaseId_PLangId",
+                table: "SolutionAssessment",
+                columns: new[] { "UserId", "ExerciseReleaseId", "PLangId" },
+                unique: true);
+
+            migrationBuilder.CreateIndex(
+                name: "IX_CustomProjectTestSettings_CustomProjectTestId",
+                table: "CustomProjectTestSettings",
+                column: "CustomProjectTestId",
+                unique: true);
+
+            migrationBuilder.AddForeignKey(
+                name: "FK_CustomProjectTestSettings_CustomProjectTests_CustomProjectTestId",
+                table: "CustomProjectTestSettings",
+                column: "CustomProjectTestId",
+                principalTable: "CustomProjectTests",
+                principalColumn: "Id",
+                onDelete: ReferentialAction.Cascade);
+
+            migrationBuilder.AddForeignKey(
+                name: "FK_SolutionAssessment_Solutions_UserId_ExerciseReleaseId_PLangId",
+                table: "SolutionAssessment",
+                columns: new[] { "UserId", "ExerciseReleaseId", "PLangId" },
+                principalTable: "Solutions",
+                principalColumns: new[] { "UserId", "ExerciseReleaseId", "PLangId" },
+                onDelete: ReferentialAction.Cascade);
+
+            migrationBuilder.AddForeignKey(
+                name: "FK_TestCaseSettingses_Tests_TestId",
+                table: "TestCaseSettingses",
+                column: "TestId",
+                principalTable: "Tests",
+                principalColumn: "Id",
+                onDelete: ReferentialAction.Cascade);
+
+            migrationBuilder.AddForeignKey(
+                name: "FK_GroupRolePermissions_GroupRoles_GroupRoleId",
+                table: "GroupRolePermissions",
+                column: "GroupRoleId",
+                principalTable: "GroupRoles",
+                principalColumn: "Id",
+                onDelete: ReferentialAction.Cascade);
+
+            migrationBuilder.AddForeignKey(
+                name: "FK_CodeEditorSettings_UserSettingses_UserSettingId",
+                table: "CodeEditorSettings",
+                column: "UserSettingId",
+                principalTable: "UserSettingses",
+                principalColumn: "Id",
+                onDelete: ReferentialAction.Cascade);
+
+            migrationBuilder.AddForeignKey(
+                name: "FK_SystemRolePermissions_SystemRoles_SystemRoleId",
+                table: "SystemRolePermissions",
+                column: "SystemRoleId",
+                principalTable: "SystemRoles",
+                principalColumn: "Id",
+                onDelete: ReferentialAction.Cascade);
+        }
+
+        protected override void Down(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropForeignKey(
+                name: "FK_CustomProjectTestSettings_CustomProjectTests_CustomProjectTestId",
+                table: "CustomProjectTestSettings");
+
+            migrationBuilder.DropForeignKey(
+                name: "FK_SolutionAssessment_Solutions_UserId_ExerciseReleaseId_PLangId",
+                table: "SolutionAssessment");
+
+            migrationBuilder.DropForeignKey(
+                name: "FK_TestCaseSettingses_Tests_TestId",
+                table: "TestCaseSettingses");
+
+            migrationBuilder.DropForeignKey(
+                name: "FK_GroupRolePermissions_GroupRoles_GroupRoleId",
+                table: "GroupRolePermissions");
+
+            migrationBuilder.DropForeignKey(
+                name: "FK_CodeEditorSettings_UserSettingses_UserSettingId",
+                table: "CodeEditorSettings");
+
+            migrationBuilder.DropForeignKey(
+                name: "FK_SystemRolePermissions_SystemRoles_SystemRoleId",
+                table: "SystemRolePermissions");
+
+            migrationBuilder.DropIndex(
+                name: "IX_SystemRolePermissions_SystemRoleId",
+                table: "SystemRolePermissions");
+
+            migrationBuilder.DropIndex(
+                name: "IX_CodeEditorSettings_UserSettingId",
+                table: "CodeEditorSettings");
+
+            migrationBuilder.DropIndex(
+                name: "IX_GroupRolePermissions_GroupRoleId",
+                table: "GroupRolePermissions");
+
+            migrationBuilder.DropIndex(
+                name: "IX_TestCaseSettingses_TestId",
+                table: "TestCaseSettingses");
+
+            migrationBuilder.DropIndex(
+                name: "IX_SolutionAssessment_UserId_ExerciseReleaseId_PLangId",
+                table: "SolutionAssessment");
+
+            migrationBuilder.DropIndex(
+                name: "IX_CustomProjectTestSettings_CustomProjectTestId",
+                table: "CustomProjectTestSettings");
+
+            migrationBuilder.DropColumn(
+                name: "CreatedAt",
+                table: "SolutionAssessment");
+
+            migrationBuilder.DropColumn(
+                name: "LastUpdatedAt",
+                table: "SolutionAssessment");
+
+            migrationBuilder.AddColumn<int>(
+                name: "SystemRolePermissionId",
+                table: "SystemRoles",
+                nullable: false,
+                defaultValue: 0);
+
+            migrationBuilder.AddColumn<int>(
+                name: "CodeEditorSettingsId",
+                table: "UserSettingses",
+                nullable: false,
+                defaultValue: 0);
+
+            migrationBuilder.AddColumn<int>(
+                name: "GroupRolePermissionId",
+                table: "GroupRoles",
+                nullable: false,
+                defaultValue: 0);
+
+            migrationBuilder.AddColumn<int>(
+                name: "TestSettingsId",
+                table: "Tests",
+                nullable: false,
+                defaultValue: 0);
+
+            migrationBuilder.AddColumn<int>(
+                name: "AssessmentId",
+                table: "Solutions",
+                nullable: true);
+
+            migrationBuilder.AddColumn<int>(
+                name: "TestSettingsId",
+                table: "CustomProjectTests",
+                nullable: false,
+                defaultValue: 0);
+
+            migrationBuilder.CreateIndex(
+                name: "IX_SystemRoles_SystemRolePermissionId",
+                table: "SystemRoles",
+                column: "SystemRolePermissionId",
+                unique: true);
+
+            migrationBuilder.CreateIndex(
+                name: "IX_UserSettingses_CodeEditorSettingsId",
+                table: "UserSettingses",
+                column: "CodeEditorSettingsId",
+                unique: true);
+
+            migrationBuilder.CreateIndex(
+                name: "IX_GroupRoles_GroupRolePermissionId",
+                table: "GroupRoles",
+                column: "GroupRolePermissionId",
+                unique: true);
+
+            migrationBuilder.CreateIndex(
+                name: "IX_Tests_TestSettingsId",
+                table: "Tests",
+                column: "TestSettingsId",
+                unique: true);
+
+            migrationBuilder.CreateIndex(
+                name: "IX_Solutions_AssessmentId",
+                table: "Solutions",
+                column: "AssessmentId",
+                unique: true);
+
+            migrationBuilder.CreateIndex(
+                name: "IX_CustomProjectTests_TestSettingsId",
+                table: "CustomProjectTests",
+                column: "TestSettingsId",
+                unique: true);
+
+            migrationBuilder.AddForeignKey(
+                name: "FK_CustomProjectTests_TestCaseSettingses_TestSettingsId",
+                table: "CustomProjectTests",
+                column: "TestSettingsId",
+                principalTable: "TestCaseSettingses",
+                principalColumn: "Id",
+                onDelete: ReferentialAction.Cascade);
+
+            migrationBuilder.AddForeignKey(
+                name: "FK_Solutions_SolutionAssessment_AssessmentId",
+                table: "Solutions",
+                column: "AssessmentId",
+                principalTable: "SolutionAssessment",
+                principalColumn: "Id",
+                onDelete: ReferentialAction.Cascade);
+
+            migrationBuilder.AddForeignKey(
+                name: "FK_Tests_TestCaseSettingses_TestSettingsId",
+                table: "Tests",
+                column: "TestSettingsId",
+                principalTable: "TestCaseSettingses",
+                principalColumn: "Id",
+                onDelete: ReferentialAction.Cascade);
+
+            migrationBuilder.AddForeignKey(
+                name: "FK_GroupRoles_GroupRolePermissions_GroupRolePermissionId",
+                table: "GroupRoles",
+                column: "GroupRolePermissionId",
+                principalTable: "GroupRolePermissions",
+                principalColumn: "Id",
+                onDelete: ReferentialAction.Cascade);
+
+            migrationBuilder.AddForeignKey(
+                name: "FK_UserSettingses_CodeEditorSettings_CodeEditorSettingsId",
+                table: "UserSettingses",
+                column: "CodeEditorSettingsId",
+                principalTable: "CodeEditorSettings",
+                principalColumn: "Id",
+                onDelete: ReferentialAction.Cascade);
+
+            migrationBuilder.AddForeignKey(
+                name: "FK_SystemRoles_SystemRolePermissions_SystemRolePermissionId",
+                table: "SystemRoles",
+                column: "SystemRolePermissionId",
+                principalTable: "SystemRolePermissions",
+                principalColumn: "Id",
+                onDelete: ReferentialAction.Cascade);
+        }
+    }
+}
diff --git a/src/ClientServer/Migrations/YapexDbContextModelSnapshot.cs b/src/ClientServer/Migrations/YapexDbContextModelSnapshot.cs
index 295dacc..52b95a5 100755
--- a/src/ClientServer/Migrations/YapexDbContextModelSnapshot.cs
+++ b/src/ClientServer/Migrations/YapexDbContextModelSnapshot.cs
@@ -161,8 +161,6 @@ namespace ClientServer.Migrations
 
                     b.Property<DateTime>("LastUpdatedAt");
 
-                    b.Property<int>("TestSettingsId");
-
                     b.Property<int>("TestTypeId");
 
                     b.Property<int>("Weight");
@@ -171,9 +169,6 @@ namespace ClientServer.Migrations
 
                     b.HasIndex("CustomProjectId");
 
-                    b.HasIndex("TestSettingsId")
-                        .IsUnique();
-
                     b.HasIndex("TestTypeId");
 
                     b.ToTable("CustomProjectTests");
@@ -228,6 +223,9 @@ namespace ClientServer.Migrations
 
                     b.HasKey("Id");
 
+                    b.HasIndex("CustomProjectTestId")
+                        .IsUnique();
+
                     b.ToTable("CustomProjectTestSettings");
                 });
 
@@ -748,8 +746,6 @@ namespace ClientServer.Migrations
 
                     b.Property<int>("PLangId");
 
-                    b.Property<int?>("AssessmentId");
-
                     b.Property<DateTime>("CreatedAt");
 
                     b.Property<string>("LastEditingIpAddress")
@@ -764,9 +760,6 @@ namespace ClientServer.Migrations
 
                     b.HasKey("UserId", "ExerciseReleaseId", "PLangId");
 
-                    b.HasIndex("AssessmentId")
-                        .IsUnique();
-
                     b.HasIndex("MainFileId")
                         .IsUnique();
 
@@ -782,6 +775,8 @@ namespace ClientServer.Migrations
                     b.Property<int>("Id")
                         .ValueGeneratedOnAdd();
 
+                    b.Property<DateTime>("CreatedAt");
+
                     b.Property<int>("ExerciseReleaseId");
 
                     b.Property<string>("FeedbackForStudent")
@@ -790,6 +785,8 @@ namespace ClientServer.Migrations
                     b.Property<string>("LastAssessmentErrorMessage")
                         .HasMaxLength(80000);
 
+                    b.Property<DateTime>("LastUpdatedAt");
+
                     b.Property<int?>("ManualPoints");
 
                     b.Property<int>("MaxNormalTestPoints");
@@ -809,6 +806,9 @@ namespace ClientServer.Migrations
 
                     b.HasKey("Id");
 
+                    b.HasIndex("UserId", "ExerciseReleaseId", "PLangId")
+                        .IsUnique();
+
                     b.ToTable("SolutionAssessment");
                 });
 
@@ -1065,8 +1065,6 @@ namespace ClientServer.Migrations
 
                     b.Property<DateTime>("LastUpdatedAt");
 
-                    b.Property<int>("TestSettingsId");
-
                     b.Property<int>("TestTypeId");
 
                     b.Property<int>("Weight");
@@ -1075,9 +1073,6 @@ namespace ClientServer.Migrations
 
                     b.HasIndex("ExerciseId");
 
-                    b.HasIndex("TestSettingsId")
-                        .IsUnique();
-
                     b.HasIndex("TestTypeId");
 
                     b.ToTable("Tests");
@@ -1107,6 +1102,9 @@ namespace ClientServer.Migrations
 
                     b.HasKey("Id");
 
+                    b.HasIndex("TestId")
+                        .IsUnique();
+
                     b.ToTable("TestCaseSettingses");
                 });
 
@@ -1343,15 +1341,10 @@ namespace ClientServer.Migrations
                     b.Property<string>("DisplayName")
                         .HasMaxLength(2000);
 
-                    b.Property<int>("GroupRolePermissionId");
-
                     b.Property<DateTime>("LastUpdatedAt");
 
                     b.HasKey("Id");
 
-                    b.HasIndex("GroupRolePermissionId")
-                        .IsUnique();
-
                     b.ToTable("GroupRoles");
                 });
 
@@ -1392,6 +1385,9 @@ namespace ClientServer.Migrations
 
                     b.HasKey("Id");
 
+                    b.HasIndex("GroupRoleId")
+                        .IsUnique();
+
                     b.ToTable("GroupRolePermissions");
                 });
 
@@ -1425,6 +1421,9 @@ namespace ClientServer.Migrations
 
                     b.HasKey("Id");
 
+                    b.HasIndex("UserSettingId")
+                        .IsUnique();
+
                     b.ToTable("CodeEditorSettings");
                 });
 
@@ -1433,8 +1432,6 @@ namespace ClientServer.Migrations
                     b.Property<int>("Id")
                         .ValueGeneratedOnAdd();
 
-                    b.Property<int>("CodeEditorSettingsId");
-
                     b.Property<DateTime>("CreatedAt");
 
                     b.Property<int?>("LangId");
@@ -1448,9 +1445,6 @@ namespace ClientServer.Migrations
 
                     b.HasKey("Id");
 
-                    b.HasIndex("CodeEditorSettingsId")
-                        .IsUnique();
-
                     b.HasIndex("LangId");
 
                     b.HasIndex("UserId")
@@ -1474,13 +1468,8 @@ namespace ClientServer.Migrations
 
                     b.Property<DateTime>("LastUpdatedAt");
 
-                    b.Property<int>("SystemRolePermissionId");
-
                     b.HasKey("Id");
 
-                    b.HasIndex("SystemRolePermissionId")
-                        .IsUnique();
-
                     b.ToTable("SystemRoles");
                 });
 
@@ -1521,6 +1510,9 @@ namespace ClientServer.Migrations
 
                     b.HasKey("Id");
 
+                    b.HasIndex("SystemRoleId")
+                        .IsUnique();
+
                     b.ToTable("SystemRolePermissions");
                 });
 
@@ -1742,17 +1734,20 @@ namespace ClientServer.Migrations
                         .HasForeignKey("CustomProjectId")
                         .OnDelete(DeleteBehavior.Cascade);
 
-                    b.HasOne("ClientServer.Models.Exercises.Tests.TestSettings", "TestSettings")
-                        .WithOne()
-                        .HasForeignKey("ClientServer.Models.CustomProjects.CustomProjectTest", "TestSettingsId")
-                        .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")
@@ -1946,11 +1941,6 @@ namespace ClientServer.Migrations
 
             modelBuilder.Entity("ClientServer.Models.Exercises.Solution.Solution", b =>
                 {
-                    b.HasOne("ClientServer.Models.Exercises.Solution.SolutionAssessment", "Assessment")
-                        .WithOne("Solution")
-                        .HasForeignKey("ClientServer.Models.Exercises.Solution.Solution", "AssessmentId")
-                        .OnDelete(DeleteBehavior.Cascade);
-
                     b.HasOne("ClientServer.Models.Exercises.Solution.SolutionFile", "MainFile")
                         .WithOne()
                         .HasForeignKey("ClientServer.Models.Exercises.Solution.Solution", "MainFileId")
@@ -1966,6 +1956,14 @@ namespace ClientServer.Migrations
                         .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")
@@ -2041,16 +2039,19 @@ namespace ClientServer.Migrations
                         .HasForeignKey("ExerciseId")
                         .OnDelete(DeleteBehavior.Cascade);
 
-                    b.HasOne("ClientServer.Models.Exercises.Tests.TestSettings", "TestSettings")
-                        .WithOne()
-                        .HasForeignKey("ClientServer.Models.Exercises.Tests.Test", "TestSettingsId")
-                        .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")
@@ -2080,21 +2081,24 @@ namespace ClientServer.Migrations
                         .OnDelete(DeleteBehavior.Cascade);
                 });
 
-            modelBuilder.Entity("ClientServer.Models.Users.GroupRole", b =>
+            modelBuilder.Entity("ClientServer.Models.Users.GroupRolePermission", b =>
                 {
-                    b.HasOne("ClientServer.Models.Users.GroupRolePermission", "GroupRolePermission")
-                        .WithOne()
-                        .HasForeignKey("ClientServer.Models.Users.GroupRole", "GroupRolePermissionId")
+                    b.HasOne("ClientServer.Models.Users.GroupRole", "GroupRole")
+                        .WithOne("GroupRolePermission")
+                        .HasForeignKey("ClientServer.Models.Users.GroupRolePermission", "GroupRoleId")
                         .OnDelete(DeleteBehavior.Cascade);
                 });
 
-            modelBuilder.Entity("ClientServer.Models.Users.Settings.UserSetting", b =>
+            modelBuilder.Entity("ClientServer.Models.Users.Settings.CodeEditorSetting", b =>
                 {
-                    b.HasOne("ClientServer.Models.Users.Settings.CodeEditorSetting", "CodeEditorSetting")
-                        .WithOne()
-                        .HasForeignKey("ClientServer.Models.Users.Settings.UserSetting", "CodeEditorSettingsId")
+                    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")
@@ -2106,11 +2110,11 @@ namespace ClientServer.Migrations
                         .OnDelete(DeleteBehavior.Cascade);
                 });
 
-            modelBuilder.Entity("ClientServer.Models.Users.SystemRole", b =>
+            modelBuilder.Entity("ClientServer.Models.Users.SystemRolePermission", b =>
                 {
-                    b.HasOne("ClientServer.Models.Users.SystemRolePermission", "SystemRolePermission")
-                        .WithOne()
-                        .HasForeignKey("ClientServer.Models.Users.SystemRole", "SystemRolePermissionId")
+                    b.HasOne("ClientServer.Models.Users.SystemRole", "SystemRole")
+                        .WithOne("SystemRolePermission")
+                        .HasForeignKey("ClientServer.Models.Users.SystemRolePermission", "SystemRoleId")
                         .OnDelete(DeleteBehavior.Cascade);
                 });
 
diff --git a/src/ClientServer/Models/CustomProjects/CustomProjectTest.cs b/src/ClientServer/Models/CustomProjects/CustomProjectTest.cs
index dca5353..e3b3b38 100644
--- a/src/ClientServer/Models/CustomProjects/CustomProjectTest.cs
+++ b/src/ClientServer/Models/CustomProjects/CustomProjectTest.cs
@@ -51,8 +51,7 @@ namespace ClientServer.Models.CustomProjects
         public List<CustomProjectTestWithFileAsAssetReference> AssetReferences { get; set; }
 
 
-        public int TestSettingsId { get; set; }
-        public TestSettings TestSettings { get; set; }
+        public CustomProjectTestSettings CustomProjectTestSettings { get; set; }
         
         
         public int CustomProjectId { get; set; }
diff --git a/src/ClientServer/Models/CustomProjects/CustomProjectTestSettings.cs b/src/ClientServer/Models/CustomProjects/CustomProjectTestSettings.cs
index 78d54e3..1a2744e 100644
--- a/src/ClientServer/Models/CustomProjects/CustomProjectTestSettings.cs
+++ b/src/ClientServer/Models/CustomProjects/CustomProjectTestSettings.cs
@@ -37,6 +37,6 @@ namespace ClientServer.Models.CustomProjects
         
         //fk
         public int CustomProjectTestId { get; set; }
-//        public CustomProjectTest CustomProjectTest { get; set; }
+        public CustomProjectTest CustomProjectTest { get; set; }
     }
 }
diff --git a/src/ClientServer/Models/Exercises/Solution/Solution.cs b/src/ClientServer/Models/Exercises/Solution/Solution.cs
index d24e8ed..92a308b 100644
--- a/src/ClientServer/Models/Exercises/Solution/Solution.cs
+++ b/src/ClientServer/Models/Exercises/Solution/Solution.cs
@@ -67,11 +67,6 @@ namespace ClientServer.Models.Exercises.Solution
         
         
         //---from old solution version (we now have only one solution (version))
-
-        /// <summary>
-        /// the solution assessment id
-        /// </summary>
-        public int? AssessmentId { get; set; }
         
         /// <summary>
         /// the datetime where the solution was created
diff --git a/src/ClientServer/Models/Exercises/Tests/Test.cs b/src/ClientServer/Models/Exercises/Tests/Test.cs
index 63a9e9a..70a9ec9 100644
--- a/src/ClientServer/Models/Exercises/Tests/Test.cs
+++ b/src/ClientServer/Models/Exercises/Tests/Test.cs
@@ -55,7 +55,6 @@ namespace ClientServer.Models.Exercises.Tests
         public List<TestWithFileAsAssetReference> AssetReferences { get; set; }
 
 
-        public int TestSettingsId { get; set; }
         /// <summary>
         /// the connected <see cref="TestSettings"/>
         /// </summary>
diff --git a/src/ClientServer/Models/Exercises/Tests/TestSettings.cs b/src/ClientServer/Models/Exercises/Tests/TestSettings.cs
index 2c84115..75df339 100644
--- a/src/ClientServer/Models/Exercises/Tests/TestSettings.cs
+++ b/src/ClientServer/Models/Exercises/Tests/TestSettings.cs
@@ -40,7 +40,7 @@ namespace ClientServer.Models.Exercises.Tests
         
         //fk
         public int TestId { get; set; }
-//        public Test Test { get; set; }
+        public Test Test { get; set; }
 
     }
 }
diff --git a/src/ClientServer/Models/Interfaces/AllTest.cs b/src/ClientServer/Models/Interfaces/AllTest.cs
index 41505ff..e7c36bd 100644
--- a/src/ClientServer/Models/Interfaces/AllTest.cs
+++ b/src/ClientServer/Models/Interfaces/AllTest.cs
@@ -114,7 +114,7 @@ namespace ClientServer.Models.Interfaces
             {
                 Id = test.Id,
                 Content = test.Content,
-                TestSettings = test.TestSettings,
+                TestSettings = test.CustomProjectTestSettings,
                 DisplayName = test.DisplayName,
                 TestAssetsWithContent = testAssets,
                 TestType = test.TestType
diff --git a/src/ClientServer/Models/Users/GroupRole.cs b/src/ClientServer/Models/Users/GroupRole.cs
index 2517350..3db7c8f 100644
--- a/src/ClientServer/Models/Users/GroupRole.cs
+++ b/src/ClientServer/Models/Users/GroupRole.cs
@@ -26,13 +26,11 @@ namespace ClientServer.Models.Users
 
         //foreign
 
-
         /// <summary>
         /// all related <see cref="UserWithUserGroup"/> s (every <see cref="User"/> that has this <see cref="GroupRole"/> for the UserUserGroup relation)
         /// </summary>
         public List<UserWithUserGroup> UserUserGroups { get; set; }
-
-        public int GroupRolePermissionId { get; set; }
+        
         /// <summary>
         /// the connected <see cref="GroupRolePermission"/>
         /// </summary>
diff --git a/src/ClientServer/Models/Users/GroupRolePermission.cs b/src/ClientServer/Models/Users/GroupRolePermission.cs
index fc76ce4..50d97da 100644
--- a/src/ClientServer/Models/Users/GroupRolePermission.cs
+++ b/src/ClientServer/Models/Users/GroupRolePermission.cs
@@ -103,6 +103,6 @@ namespace ClientServer.Models.Users
 
         //fk
         public int GroupRoleId { get; set; }
-//        public GroupRole GroupRole { get; set; }
+        public GroupRole GroupRole { get; set; }
     }
 }
diff --git a/src/ClientServer/Models/Users/Settings/CodeEditorSettings.cs b/src/ClientServer/Models/Users/Settings/CodeEditorSettings.cs
index 46a35b9..f1182d2 100644
--- a/src/ClientServer/Models/Users/Settings/CodeEditorSettings.cs
+++ b/src/ClientServer/Models/Users/Settings/CodeEditorSettings.cs
@@ -46,7 +46,7 @@ namespace ClientServer.Models.Users.Settings
 
         //fk
         public int UserSettingId { get; set; }
-//        public UserSetting UserSetting { get; set; }
+        public UserSetting UserSetting { get; set; }
 
     }
 }
diff --git a/src/ClientServer/Models/Users/Settings/UserSetting.cs b/src/ClientServer/Models/Users/Settings/UserSetting.cs
index 36d49d1..909af73 100644
--- a/src/ClientServer/Models/Users/Settings/UserSetting.cs
+++ b/src/ClientServer/Models/Users/Settings/UserSetting.cs
@@ -8,7 +8,6 @@ namespace ClientServer.Models.Users.Settings
         public int Id { get; set; }
 
 
-        public int CodeEditorSettingsId { get; set; }
         public CodeEditorSetting CodeEditorSetting { get; set; }
 
 
diff --git a/src/ClientServer/Models/Users/SystemRole.cs b/src/ClientServer/Models/Users/SystemRole.cs
index 08125b6..170d40f 100644
--- a/src/ClientServer/Models/Users/SystemRole.cs
+++ b/src/ClientServer/Models/Users/SystemRole.cs
@@ -26,8 +26,6 @@ namespace ClientServer.Models.Users
         public string Email { get; set; }
 
 
-
-        public int SystemRolePermissionId { get; set; }
         /// <summary>
         /// the connected <see cref="SystemRolePermission"/>
         /// </summary>
diff --git a/src/ClientServer/Models/Users/SystemRolePermission.cs b/src/ClientServer/Models/Users/SystemRolePermission.cs
index e8554f9..bee0b07 100644
--- a/src/ClientServer/Models/Users/SystemRolePermission.cs
+++ b/src/ClientServer/Models/Users/SystemRolePermission.cs
@@ -79,7 +79,7 @@ namespace ClientServer.Models.Users
 
         //fk
         public int SystemRoleId { get; set; }
-//        public SystemRole SystemRole { get; set; }
+        public SystemRole SystemRole { get; set; }
 
     }
 }
diff --git a/src/ClientServer/appsettings.json b/src/ClientServer/appsettings.json
index 52d6736..9d2da60 100644
--- a/src/ClientServer/appsettings.json
+++ b/src/ClientServer/appsettings.json
@@ -10,7 +10,7 @@
   
   "IsDebugMode": true,
   "IsDbBootstrapEnabled": false,
-  "DbConnectionString": "Username=syndrom;Password=janis;Host=localhost;Database=SyndromDb;Pooling=true",
+  "DbConnectionString": "Username=postgres;Password=janis;Host=localhost;Database=yapexDb;Pooling=true",
   "SystemSalt": "NeverChangeThisAfterFirstStartup",
   "ExternalLoginUrl": "https://uebungsportal.informatik.uni-halle.de/ostepu/DB/DBTransaction/transaction/authentication/redirect/transaction/",
   "MainEntrySite": "/",
@@ -20,7 +20,7 @@
   "DebugOriginUrl": "http://localhost:8080",
   "DeployOriginUrls": ["https://yapex.informatik.uni-halle.de"],
   "IsSlave": false,
-  "EnsureFileUploadDirStructure": false,
+  "EnsureFileUploadDirStructure": true,
   "OnlySecureFlaggedCookies": false,
   "IsInitControllerEnabled": true,
   "MaxUploadFileSizeInByte": "1048576"
-- 
GitLab