diff --git a/Source/SeaInk.Infrastructure/SeaInk.Infrastructure.DataAccess/Database/DatabaseContext.cs b/Source/SeaInk.Infrastructure/SeaInk.Infrastructure.DataAccess/Database/DatabaseContext.cs index a32565a..52eab79 100644 --- a/Source/SeaInk.Infrastructure/SeaInk.Infrastructure.DataAccess/Database/DatabaseContext.cs +++ b/Source/SeaInk.Infrastructure/SeaInk.Infrastructure.DataAccess/Database/DatabaseContext.cs @@ -1,9 +1,10 @@ using Microsoft.EntityFrameworkCore; +using Newtonsoft.Json; using SeaInk.Core.Entities; using SeaInk.Core.TableLayout; -using SeaInk.Core.TableLayout.Components; -using SeaInk.Core.TableLayout.ComponentsBase; +using SeaInk.Infrastructure.DataAccess.Exceptions; using SeaInk.Infrastructure.DataAccess.Models; +using SeaInk.Utility.Extensions; namespace SeaInk.Infrastructure.DataAccess.Database { @@ -36,7 +37,12 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) ConfigureMentor(modelBuilder); ConfigureStudent(modelBuilder); - // ConfigureTableComponents(modelBuilder); + modelBuilder.Entity() + .Property(ssg => ssg.Layout) + .HasConversion( + component => JsonConvert.SerializeObject(component), + s => JsonConvert.DeserializeObject(s) + .ThrowIfNull(new FailedTableLayoutComponentDeserializationException(s))); } private static void ConfigureAssignment(ModelBuilder modelBuilder) @@ -91,16 +97,5 @@ private static void ConfigureStudyGroupSubject(ModelBuilder modelBuilder) .Navigation(ssg => ssg.Mentors) .HasField("_mentors"); } - - private static void ConfigureTableComponents(ModelBuilder modelBuilder) - { - modelBuilder.Entity().Property(x => x.Id).ValueGeneratedNever(); - modelBuilder.Entity(typeof(CompositeLayoutComponent<>)).HasMany("_components"); - modelBuilder.Entity().Property("_value"); - - modelBuilder.Entity().HasOne("_header"); - modelBuilder.Entity().HasOne>("_stack"); - modelBuilder.Entity().HasOne>("_stack"); - } } } \ No newline at end of file diff --git a/Source/SeaInk.Infrastructure/SeaInk.Infrastructure.DataAccess/Exceptions/FailedTableLayoutComponentDeserializationException.cs b/Source/SeaInk.Infrastructure/SeaInk.Infrastructure.DataAccess/Exceptions/FailedTableLayoutComponentDeserializationException.cs new file mode 100644 index 0000000..6b5525b --- /dev/null +++ b/Source/SeaInk.Infrastructure/SeaInk.Infrastructure.DataAccess/Exceptions/FailedTableLayoutComponentDeserializationException.cs @@ -0,0 +1,10 @@ +using SeaInk.Core.TableLayout; +using SeaInk.Core.Tools; + +namespace SeaInk.Infrastructure.DataAccess.Exceptions; + +public class FailedTableLayoutComponentDeserializationException : SeaInkException +{ + public FailedTableLayoutComponentDeserializationException(string serialized) + : base($"{nameof(TableLayoutComponent)} deserialization failed. Value:\n{serialized}") { } +} \ No newline at end of file diff --git a/Source/SeaInk.Infrastructure/SeaInk.Infrastructure.DataAccess/SeaInk.Infrastructure.DataAccess.csproj b/Source/SeaInk.Infrastructure/SeaInk.Infrastructure.DataAccess/SeaInk.Infrastructure.DataAccess.csproj index 8912e8c..ec6bb53 100644 --- a/Source/SeaInk.Infrastructure/SeaInk.Infrastructure.DataAccess/SeaInk.Infrastructure.DataAccess.csproj +++ b/Source/SeaInk.Infrastructure/SeaInk.Infrastructure.DataAccess/SeaInk.Infrastructure.DataAccess.csproj @@ -24,6 +24,7 @@ + all runtime; build; native; contentfiles; analyzers; buildtransitive