diff --git a/directory/src/FilterLists.Directory.Infrastructure/Persistence/Queries/Facade/DirectoryQueryDbContext.cs b/directory/src/FilterLists.Directory.Infrastructure/Persistence/Queries/Facade/DirectoryQueryDbContext.cs index 422b61609..c7c43d8f0 100644 --- a/directory/src/FilterLists.Directory.Infrastructure/Persistence/Queries/Facade/DirectoryQueryDbContext.cs +++ b/directory/src/FilterLists.Directory.Infrastructure/Persistence/Queries/Facade/DirectoryQueryDbContext.cs @@ -1,4 +1,6 @@ -using FilterLists.Directory.Infrastructure.Persistence.Queries.Entities; +using System; +using FilterLists.Directory.Infrastructure.Persistence.Queries.Entities; +using FilterLists.Directory.Infrastructure.Persistence.Queries.Mappings; using Microsoft.EntityFrameworkCore; namespace FilterLists.Directory.Infrastructure.Persistence.Queries.Facade @@ -16,5 +18,18 @@ public DirectoryQueryDbContext(DbContextOptions options public DbSet Software => Set(); public DbSet Syntaxes => Set(); public DbSet Tags => Set(); + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + _ = modelBuilder ?? throw new ArgumentNullException(nameof(modelBuilder)); + + //TODO: figure out why this extension doesn't load configs + modelBuilder.ApplyConfigurationsFromAssembly(GetType().Assembly); + + modelBuilder.ApplyConfiguration(new DependentTypeConfiguration()); + modelBuilder.ApplyConfiguration(new FilterListLanguageTypeConfiguration()); + modelBuilder.ApplyConfiguration(new ForkTypeConfiguration()); + modelBuilder.ApplyConfiguration(new MergeTypeConfiguration()); + } } } \ No newline at end of file diff --git a/directory/src/FilterLists.Directory.Infrastructure/Persistence/Queries/Mappings/DependentTypeConfiguration.cs b/directory/src/FilterLists.Directory.Infrastructure/Persistence/Queries/Mappings/DependentTypeConfiguration.cs new file mode 100644 index 000000000..4cb8ace3c --- /dev/null +++ b/directory/src/FilterLists.Directory.Infrastructure/Persistence/Queries/Mappings/DependentTypeConfiguration.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using FilterLists.Directory.Infrastructure.Persistence.Queries.Entities; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace FilterLists.Directory.Infrastructure.Persistence.Queries.Mappings +{ + internal class DependentTypeConfiguration : IEntityTypeConfiguration where TEntity : Dependent + { + public virtual void Configure(EntityTypeBuilder builder) + { + _ = builder ?? throw new ArgumentNullException(nameof(builder)); + + const string dependencyFilterListId = nameof(Dependent.DependencyFilterList) + "Id"; + const string dependentFilterListId = nameof(Dependent.DependentFilterList) + "Id"; + builder.Property(dependencyFilterListId); + builder.Property(dependentFilterListId); + builder.HasKey(dependencyFilterListId, dependentFilterListId); + builder.HasOne(d => d.DependencyFilterList) + .WithMany(f => (IEnumerable)f.DependencyFilterLists) + .HasForeignKey(dependencyFilterListId); + builder.HasOne(d => d.DependentFilterList) + .WithMany(f => (IEnumerable)f.DependentFilterLists) + .HasForeignKey(dependentFilterListId); + } + } +} \ No newline at end of file diff --git a/directory/src/FilterLists.Directory.Infrastructure/Persistence/Queries/Mappings/FilterListLanguageTypeConfiguration.cs b/directory/src/FilterLists.Directory.Infrastructure/Persistence/Queries/Mappings/FilterListLanguageTypeConfiguration.cs new file mode 100644 index 000000000..6b9613a37 --- /dev/null +++ b/directory/src/FilterLists.Directory.Infrastructure/Persistence/Queries/Mappings/FilterListLanguageTypeConfiguration.cs @@ -0,0 +1,22 @@ +using System; +using FilterLists.Directory.Infrastructure.Persistence.Queries.Entities; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace FilterLists.Directory.Infrastructure.Persistence.Queries.Mappings +{ + internal class FilterListLanguageTypeConfiguration : IEntityTypeConfiguration + where TEntity : FilterListLanguage + { + public virtual void Configure(EntityTypeBuilder builder) + { + _ = builder ?? throw new ArgumentNullException(nameof(builder)); + + const string filterListId = nameof(FilterListLanguage.FilterList) + "Id"; + const string languageId = nameof(FilterListLanguage.Language) + "Id"; + builder.Property(filterListId); + builder.Property(languageId); + builder.HasKey(filterListId, languageId); + } + } +} \ No newline at end of file diff --git a/directory/src/FilterLists.Directory.Infrastructure/Persistence/Queries/Mappings/ForkTypeConfiguration.cs b/directory/src/FilterLists.Directory.Infrastructure/Persistence/Queries/Mappings/ForkTypeConfiguration.cs new file mode 100644 index 000000000..770c92189 --- /dev/null +++ b/directory/src/FilterLists.Directory.Infrastructure/Persistence/Queries/Mappings/ForkTypeConfiguration.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using FilterLists.Directory.Infrastructure.Persistence.Queries.Entities; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace FilterLists.Directory.Infrastructure.Persistence.Queries.Mappings +{ + internal class ForkTypeConfiguration : IEntityTypeConfiguration where TEntity : Fork + { + public virtual void Configure(EntityTypeBuilder builder) + { + _ = builder ?? throw new ArgumentNullException(nameof(builder)); + + const string upstreamFilterListId = nameof(Fork.UpstreamFilterList) + "Id"; + const string forkFilterListId = nameof(Fork.ForkFilterList) + "Id"; + builder.Property(upstreamFilterListId); + builder.Property(forkFilterListId); + builder.HasKey(upstreamFilterListId, forkFilterListId); + builder.HasOne(f => f.UpstreamFilterList) + .WithMany(f => (IEnumerable)f.UpstreamFilterLists) + .HasForeignKey(upstreamFilterListId); + builder.HasOne(f => f.ForkFilterList) + .WithMany(f => (IEnumerable)f.ForkFilterLists) + .HasForeignKey(forkFilterListId); + } + } +} \ No newline at end of file diff --git a/directory/src/FilterLists.Directory.Infrastructure/Persistence/Queries/Mappings/MergeTypeConfiguration.cs b/directory/src/FilterLists.Directory.Infrastructure/Persistence/Queries/Mappings/MergeTypeConfiguration.cs new file mode 100644 index 000000000..7e022fa9c --- /dev/null +++ b/directory/src/FilterLists.Directory.Infrastructure/Persistence/Queries/Mappings/MergeTypeConfiguration.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using FilterLists.Directory.Infrastructure.Persistence.Queries.Entities; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace FilterLists.Directory.Infrastructure.Persistence.Queries.Mappings +{ + internal class MergeTypeConfiguration : IEntityTypeConfiguration where TEntity : Merge + { + public virtual void Configure(EntityTypeBuilder builder) + { + _ = builder ?? throw new ArgumentNullException(nameof(builder)); + + const string includedInFilterListId = nameof(Merge.IncludedInFilterList) + "Id"; + const string includesFilterListId = nameof(Merge.IncludesFilterList) + "Id"; + builder.Property(includedInFilterListId); + builder.Property(includesFilterListId); + builder.HasKey(includedInFilterListId, includesFilterListId); + builder.HasOne(m => m.IncludedInFilterList) + .WithMany(f => (IEnumerable)f.IncludedInFilterLists) + .HasForeignKey(includedInFilterListId); + builder.HasOne(m => m.IncludesFilterList) + .WithMany(f => (IEnumerable)f.IncludesFilterLists) + .HasForeignKey(includesFilterListId); + } + } +} \ No newline at end of file