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