feat(directory): configure many-to-many relationships

This commit is contained in:
Collin M. Barrett 2020-08-22 17:55:32 -05:00
parent 3f83b6edf2
commit 95ab429048
7 changed files with 135 additions and 2 deletions

View file

@ -26,7 +26,8 @@ public override int SaveChanges(bool acceptAllChangesOnSuccess)
throw new InvalidOperationException("This context is read-only.");
}
public override Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = new CancellationToken())
public override Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess,
CancellationToken cancellationToken = default)
{
throw new InvalidOperationException("This context is read-only.");
}
@ -35,13 +36,19 @@ 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);
// TODO: rm explicit below once ApplyConfigurationsFromAssembly() works properly
modelBuilder.ApplyConfiguration(new DependentTypeConfiguration<Dependent>());
modelBuilder.ApplyConfiguration(new FilterListLanguageTypeConfiguration<FilterListLanguage>());
modelBuilder.ApplyConfiguration(new FilterListMaintainerTypeConfiguration<FilterListMaintainer>());
modelBuilder.ApplyConfiguration(new FilterListSyntaxTypeConfiguration<FilterListSyntax>());
modelBuilder.ApplyConfiguration(new FilterListTagTypeConfiguration<FilterListTag>());
modelBuilder.ApplyConfiguration(new ForkTypeConfiguration<Fork>());
modelBuilder.ApplyConfiguration(new LanguageTypeConfiguration<Language>());
modelBuilder.ApplyConfiguration(new MergeTypeConfiguration<Merge>());
modelBuilder.ApplyConfiguration(new SoftwareSyntaxTypeConfiguration<SoftwareSyntax>());
modelBuilder.ApplyConfiguration(new ViewUrlPartialTypeConfiguration<ViewUrlPartial>());
}
}
}

View file

@ -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 FilterListMaintainerTypeConfiguration<TEntity> : IEntityTypeConfiguration<TEntity>
where TEntity : FilterListMaintainer
{
public virtual void Configure(EntityTypeBuilder<TEntity> builder)
{
_ = builder ?? throw new ArgumentNullException(nameof(builder));
const string filterListId = nameof(FilterListMaintainer.FilterList) + "Id";
const string maintainerId = nameof(FilterListMaintainer.Maintainer) + "Id";
builder.Property<ushort>(filterListId);
builder.Property<ushort>(maintainerId);
builder.HasKey(filterListId, maintainerId);
}
}
}

View file

@ -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 FilterListSyntaxTypeConfiguration<TEntity> : IEntityTypeConfiguration<TEntity>
where TEntity : FilterListSyntax
{
public virtual void Configure(EntityTypeBuilder<TEntity> builder)
{
_ = builder ?? throw new ArgumentNullException(nameof(builder));
const string filterListId = nameof(FilterListSyntax.FilterList) + "Id";
const string syntaxId = nameof(FilterListSyntax.Syntax) + "Id";
builder.Property<ushort>(filterListId);
builder.Property<ushort>(syntaxId);
builder.HasKey(filterListId, syntaxId);
}
}
}

View file

@ -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 FilterListTagTypeConfiguration<TEntity> : IEntityTypeConfiguration<TEntity>
where TEntity : FilterListTag
{
public virtual void Configure(EntityTypeBuilder<TEntity> builder)
{
_ = builder ?? throw new ArgumentNullException(nameof(builder));
const string filterListId = nameof(FilterListTag.FilterList) + "Id";
const string tagId = nameof(FilterListTag.Tag) + "Id";
builder.Property<ushort>(filterListId);
builder.Property<ushort>(tagId);
builder.HasKey(filterListId, tagId);
}
}
}

View file

@ -0,0 +1,18 @@
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 LanguageTypeConfiguration<TEntity> : IEntityTypeConfiguration<TEntity>
where TEntity : Language
{
public virtual void Configure(EntityTypeBuilder<TEntity> builder)
{
_ = builder ?? throw new ArgumentNullException(nameof(builder));
builder.HasKey(l => l.Iso6391);
}
}
}

View file

@ -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 SoftwareSyntaxTypeConfiguration<TEntity> : IEntityTypeConfiguration<TEntity>
where TEntity : SoftwareSyntax
{
public virtual void Configure(EntityTypeBuilder<TEntity> builder)
{
_ = builder ?? throw new ArgumentNullException(nameof(builder));
const string softwareId = nameof(SoftwareSyntax.Software) + "Id";
const string syntaxId = nameof(SoftwareSyntax.Syntax) + "Id";
builder.Property<ushort>(softwareId);
builder.Property<ushort>(syntaxId);
builder.HasKey(softwareId, syntaxId);
}
}
}

View file

@ -0,0 +1,20 @@
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 ViewUrlPartialTypeConfiguration<TEntity> : IEntityTypeConfiguration<TEntity>
where TEntity : ViewUrlPartial
{
public virtual void Configure(EntityTypeBuilder<TEntity> builder)
{
_ = builder ?? throw new ArgumentNullException(nameof(builder));
const string filterListId = nameof(ViewUrlPartial.FilterList) + "Id";
builder.Property<ushort>(filterListId);
builder.HasKey(filterListId, nameof(ViewUrlPartial.Position));
}
}
}