From c49ccaaffface6747e6d8ff7463b824240bba289 Mon Sep 17 00:00:00 2001 From: "Collin M. Barrett" Date: Wed, 26 Aug 2020 21:01:44 -0500 Subject: [PATCH] refactor(directory): use natural composite keys for nested view url owned types --- ....cs => 20200827015901_Initial.Designer.cs} | 29 +++++++------------ ...7_Initial.cs => 20200827015901_Initial.cs} | 29 +++++-------------- .../Migrations/QueryDbContextModelSnapshot.cs | 27 ++++++----------- .../Queries/Entities/FilterList.cs | 29 +++++++++++++------ .../FilterListSegmentViewUrlMirror.cs | 1 + 5 files changed, 48 insertions(+), 67 deletions(-) rename services/directory/src/FilterLists.Directory.Infrastructure.Migrations/Migrations/{20200826221237_Initial.Designer.cs => 20200827015901_Initial.Designer.cs} (95%) rename services/directory/src/FilterLists.Directory.Infrastructure.Migrations/Migrations/{20200826221237_Initial.cs => 20200827015901_Initial.cs} (94%) diff --git a/services/directory/src/FilterLists.Directory.Infrastructure.Migrations/Migrations/20200826221237_Initial.Designer.cs b/services/directory/src/FilterLists.Directory.Infrastructure.Migrations/Migrations/20200827015901_Initial.Designer.cs similarity index 95% rename from services/directory/src/FilterLists.Directory.Infrastructure.Migrations/Migrations/20200826221237_Initial.Designer.cs rename to services/directory/src/FilterLists.Directory.Infrastructure.Migrations/Migrations/20200827015901_Initial.Designer.cs index c2a480c45..07b9d8a1c 100644 --- a/services/directory/src/FilterLists.Directory.Infrastructure.Migrations/Migrations/20200826221237_Initial.Designer.cs +++ b/services/directory/src/FilterLists.Directory.Infrastructure.Migrations/Migrations/20200827015901_Initial.Designer.cs @@ -10,7 +10,7 @@ namespace FilterLists.Directory.Infrastructure.Migrations.Migrations { [DbContext(typeof(QueryDbContext))] - [Migration("20200826221237_Initial")] + [Migration("20200827015901_Initial")] partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -345,11 +345,6 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.OwnsMany("FilterLists.Directory.Infrastructure.Persistence.Queries.Entities.FilterListSegmentViewUrl", "SegmentViewUrls", b1 => { - b1.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - b1.Property("FilterListId") .HasColumnType("integer"); @@ -360,10 +355,7 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) .IsRequired() .HasColumnType("text"); - b1.HasKey("Id"); - - b1.HasIndex("FilterListId", "Position") - .IsUnique(); + b1.HasKey("FilterListId", "Position"); b1.ToTable("FilterListSegmentViewUrls"); @@ -372,26 +364,25 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b1.OwnsMany("FilterLists.Directory.Infrastructure.Persistence.Queries.Entities.FilterListSegmentViewUrlMirror", "Mirrors", b2 => { - b2.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + b2.Property("SegmentViewUrlFilterListId") + .HasColumnType("integer"); - b2.Property("SegmentViewUrlId") + b2.Property("SegmentViewUrlPosition") + .HasColumnType("integer"); + + b2.Property("Position") .HasColumnType("integer"); b2.Property("Url") .IsRequired() .HasColumnType("text"); - b2.HasKey("Id"); - - b2.HasIndex("SegmentViewUrlId"); + b2.HasKey("SegmentViewUrlFilterListId", "SegmentViewUrlPosition", "Position"); b2.ToTable("FilterListSegmentViewUrlMirrors"); b2.WithOwner("SegmentViewUrl") - .HasForeignKey("SegmentViewUrlId"); + .HasForeignKey("SegmentViewUrlFilterListId", "SegmentViewUrlPosition"); }); }); }); diff --git a/services/directory/src/FilterLists.Directory.Infrastructure.Migrations/Migrations/20200826221237_Initial.cs b/services/directory/src/FilterLists.Directory.Infrastructure.Migrations/Migrations/20200827015901_Initial.cs similarity index 94% rename from services/directory/src/FilterLists.Directory.Infrastructure.Migrations/Migrations/20200826221237_Initial.cs rename to services/directory/src/FilterLists.Directory.Infrastructure.Migrations/Migrations/20200827015901_Initial.cs index f23479c42..5d0066e94 100644 --- a/services/directory/src/FilterLists.Directory.Infrastructure.Migrations/Migrations/20200826221237_Initial.cs +++ b/services/directory/src/FilterLists.Directory.Infrastructure.Migrations/Migrations/20200827015901_Initial.cs @@ -226,15 +226,13 @@ protected override void Up(MigrationBuilder migrationBuilder) name: "FilterListSegmentViewUrls", columns: table => new { - Id = table.Column(nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - FilterListId = table.Column(nullable: false), Position = table.Column(nullable: false), + FilterListId = table.Column(nullable: false), Url = table.Column(nullable: false) }, constraints: table => { - table.PrimaryKey("PK_FilterListSegmentViewUrls", x => x.Id); + table.PrimaryKey("PK_FilterListSegmentViewUrls", x => new { x.FilterListId, x.Position }); table.ForeignKey( name: "FK_FilterListSegmentViewUrls_FilterLists_FilterListId", column: x => x.FilterListId, @@ -343,19 +341,19 @@ protected override void Up(MigrationBuilder migrationBuilder) name: "FilterListSegmentViewUrlMirrors", columns: table => new { - Id = table.Column(nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - SegmentViewUrlId = table.Column(nullable: false), + Position = table.Column(nullable: false), + SegmentViewUrlFilterListId = table.Column(nullable: false), + SegmentViewUrlPosition = table.Column(nullable: false), Url = table.Column(nullable: false) }, constraints: table => { - table.PrimaryKey("PK_FilterListSegmentViewUrlMirrors", x => x.Id); + table.PrimaryKey("PK_FilterListSegmentViewUrlMirrors", x => new { x.SegmentViewUrlFilterListId, x.SegmentViewUrlPosition, x.Position }); table.ForeignKey( name: "FK_FilterListSegmentViewUrlMirrors_FilterListSegmentViewUrls_S~", - column: x => x.SegmentViewUrlId, + columns: x => new { x.SegmentViewUrlFilterListId, x.SegmentViewUrlPosition }, principalTable: "FilterListSegmentViewUrls", - principalColumn: "Id", + principalColumns: new[] { "FilterListId", "Position" }, onDelete: ReferentialAction.Cascade); }); @@ -379,17 +377,6 @@ protected override void Up(MigrationBuilder migrationBuilder) table: "FilterLists", column: "LicenseId"); - migrationBuilder.CreateIndex( - name: "IX_FilterListSegmentViewUrlMirrors_SegmentViewUrlId", - table: "FilterListSegmentViewUrlMirrors", - column: "SegmentViewUrlId"); - - migrationBuilder.CreateIndex( - name: "IX_FilterListSegmentViewUrls_FilterListId_Position", - table: "FilterListSegmentViewUrls", - columns: new[] { "FilterListId", "Position" }, - unique: true); - migrationBuilder.CreateIndex( name: "IX_FilterListSyntaxes_SyntaxId", table: "FilterListSyntaxes", diff --git a/services/directory/src/FilterLists.Directory.Infrastructure.Migrations/Migrations/QueryDbContextModelSnapshot.cs b/services/directory/src/FilterLists.Directory.Infrastructure.Migrations/Migrations/QueryDbContextModelSnapshot.cs index cbc2b5e37..2c9781271 100644 --- a/services/directory/src/FilterLists.Directory.Infrastructure.Migrations/Migrations/QueryDbContextModelSnapshot.cs +++ b/services/directory/src/FilterLists.Directory.Infrastructure.Migrations/Migrations/QueryDbContextModelSnapshot.cs @@ -343,11 +343,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.OwnsMany("FilterLists.Directory.Infrastructure.Persistence.Queries.Entities.FilterListSegmentViewUrl", "SegmentViewUrls", b1 => { - b1.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - b1.Property("FilterListId") .HasColumnType("integer"); @@ -358,10 +353,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) .IsRequired() .HasColumnType("text"); - b1.HasKey("Id"); - - b1.HasIndex("FilterListId", "Position") - .IsUnique(); + b1.HasKey("FilterListId", "Position"); b1.ToTable("FilterListSegmentViewUrls"); @@ -370,26 +362,25 @@ protected override void BuildModel(ModelBuilder modelBuilder) b1.OwnsMany("FilterLists.Directory.Infrastructure.Persistence.Queries.Entities.FilterListSegmentViewUrlMirror", "Mirrors", b2 => { - b2.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + b2.Property("SegmentViewUrlFilterListId") + .HasColumnType("integer"); - b2.Property("SegmentViewUrlId") + b2.Property("SegmentViewUrlPosition") + .HasColumnType("integer"); + + b2.Property("Position") .HasColumnType("integer"); b2.Property("Url") .IsRequired() .HasColumnType("text"); - b2.HasKey("Id"); - - b2.HasIndex("SegmentViewUrlId"); + b2.HasKey("SegmentViewUrlFilterListId", "SegmentViewUrlPosition", "Position"); b2.ToTable("FilterListSegmentViewUrlMirrors"); b2.WithOwner("SegmentViewUrl") - .HasForeignKey("SegmentViewUrlId"); + .HasForeignKey("SegmentViewUrlFilterListId", "SegmentViewUrlPosition"); }); }); }); diff --git a/services/directory/src/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/FilterList.cs b/services/directory/src/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/FilterList.cs index c0b9dcfbb..2b73260fe 100644 --- a/services/directory/src/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/FilterList.cs +++ b/services/directory/src/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/FilterList.cs @@ -40,17 +40,28 @@ public virtual void Configure(EntityTypeBuilder builder) { _ = builder ?? throw new ArgumentNullException(nameof(builder)); builder.OwnsMany(fl => fl.SegmentViewUrls, - o => + o1 => { - o.ToTable(nameof(FilterListSegmentViewUrl) + "s"); - o.HasKey("Id"); - o.HasIndex(nameof(FilterList) + "Id", nameof(FilterListSegmentViewUrl.Position)).IsUnique(); - o.OwnsMany(p => p.Mirrors, - m => + o1.ToTable(nameof(FilterListSegmentViewUrl) + "s"); + const string filterListId = nameof(FilterList) + "Id"; + o1.HasKey(filterListId, nameof(FilterListSegmentViewUrl.Position)); + o1.Property(u => u.Position).ValueGeneratedNever(); + o1.OwnsMany(u => u.Mirrors, + o2 => { - m.ToTable(nameof(FilterListSegmentViewUrlMirror) + "s"); - m.Property("Id"); - m.HasKey("Id"); + o2.ToTable(nameof(FilterListSegmentViewUrlMirror) + "s"); + const string segmentViewUrlFilterListId = + nameof(FilterListSegmentViewUrlMirror.SegmentViewUrl) + filterListId; + const string segmentViewUrlPosition = + nameof(FilterListSegmentViewUrlMirror.SegmentViewUrl) + + nameof(FilterListSegmentViewUrlMirror.Position); + o2.Property(segmentViewUrlFilterListId); + o2.Property(segmentViewUrlPosition); + o2.Property(m => m.Position).ValueGeneratedNever(); + o2.HasKey( + segmentViewUrlFilterListId, + segmentViewUrlPosition, + nameof(FilterListSegmentViewUrlMirror.Position)); }) .HasDataJsonFile(); }) diff --git a/services/directory/src/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/FilterListSegmentViewUrlMirror.cs b/services/directory/src/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/FilterListSegmentViewUrlMirror.cs index c1c904990..12f7b3543 100644 --- a/services/directory/src/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/FilterListSegmentViewUrlMirror.cs +++ b/services/directory/src/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/FilterListSegmentViewUrlMirror.cs @@ -5,6 +5,7 @@ namespace FilterLists.Directory.Infrastructure.Persistence.Queries.Entities public class FilterListSegmentViewUrlMirror { public FilterListSegmentViewUrl SegmentViewUrl { get; private set; } = null!; + public int Position { get; private set; } public Uri Url { get; private set; } = null!; } } \ No newline at end of file