diff --git a/EFCore.Extensions.SaveOptimizer/.runsettings b/EFCore.Extensions.SaveOptimizer/.runsettings new file mode 100644 index 00000000..57d9fc29 --- /dev/null +++ b/EFCore.Extensions.SaveOptimizer/.runsettings @@ -0,0 +1,7 @@ + + + + 16 + net6.0 + + diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Internal.Load.Tests/EFCore.Extensions.SaveOptimizer.Internal.Load.Tests.csproj b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Internal.Load.Tests/EFCore.Extensions.SaveOptimizer.Internal.Load.Tests.csproj index 358d56f0..bc933bad 100644 --- a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Internal.Load.Tests/EFCore.Extensions.SaveOptimizer.Internal.Load.Tests.csproj +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Internal.Load.Tests/EFCore.Extensions.SaveOptimizer.Internal.Load.Tests.csproj @@ -8,6 +8,12 @@ false + + + Always + + + diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Internal.Tests/EFCore.Extensions.SaveOptimizer.Internal.Tests.csproj b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Internal.Tests/EFCore.Extensions.SaveOptimizer.Internal.Tests.csproj index 8302a2f9..731fa0e0 100644 --- a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Internal.Tests/EFCore.Extensions.SaveOptimizer.Internal.Tests.csproj +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Internal.Tests/EFCore.Extensions.SaveOptimizer.Internal.Tests.csproj @@ -8,6 +8,12 @@ false + + + Always + + + diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Cockroach/Migrations/20220718000505_InitialCreate.Designer.cs b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Cockroach/Migrations/20220718104142_InitialCreate.Designer.cs similarity index 91% rename from EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Cockroach/Migrations/20220718000505_InitialCreate.Designer.cs rename to EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Cockroach/Migrations/20220718104142_InitialCreate.Designer.cs index 4af79e1d..2e431212 100644 --- a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Cockroach/Migrations/20220718000505_InitialCreate.Designer.cs +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Cockroach/Migrations/20220718104142_InitialCreate.Designer.cs @@ -12,7 +12,7 @@ namespace EFCore.Extensions.SaveOptimizer.Model.Cockroach.Migrations { [DbContext(typeof(EntitiesContext))] - [Migration("20220718000505_InitialCreate")] + [Migration("20220718104142_InitialCreate")] partial class InitialCreate { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -40,6 +40,22 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.ToTable("AutoIncrementPrimaryKeyEntities"); }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.ComposedPrimaryKeyEntity", b => + { + b.Property("PrimaryFirst") + .HasColumnType("integer"); + + b.Property("PrimarySecond") + .HasColumnType("integer"); + + b.Property("Some") + .HasColumnType("text"); + + b.HasKey("PrimaryFirst", "PrimarySecond"); + + b.ToTable("ComposedPrimaryKeyEntities"); + }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.FailingEntity", b => { b.Property("Id") diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Cockroach/Migrations/20220718000505_InitialCreate.cs b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Cockroach/Migrations/20220718104142_InitialCreate.cs similarity index 90% rename from EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Cockroach/Migrations/20220718000505_InitialCreate.cs rename to EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Cockroach/Migrations/20220718104142_InitialCreate.cs index dbc6e333..a1193a35 100644 --- a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Cockroach/Migrations/20220718000505_InitialCreate.cs +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Cockroach/Migrations/20220718104142_InitialCreate.cs @@ -23,6 +23,19 @@ protected override void Up(MigrationBuilder migrationBuilder) table.PrimaryKey("PK_AutoIncrementPrimaryKeyEntities", x => x.Id); }); + migrationBuilder.CreateTable( + name: "ComposedPrimaryKeyEntities", + columns: table => new + { + PrimaryFirst = table.Column(type: "integer", nullable: false), + PrimarySecond = table.Column(type: "integer", nullable: false), + Some = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_ComposedPrimaryKeyEntities", x => new { x.PrimaryFirst, x.PrimarySecond }); + }); + migrationBuilder.CreateTable( name: "FailingEntities", columns: table => new @@ -109,6 +122,9 @@ protected override void Down(MigrationBuilder migrationBuilder) migrationBuilder.DropTable( name: "AutoIncrementPrimaryKeyEntities"); + migrationBuilder.DropTable( + name: "ComposedPrimaryKeyEntities"); + migrationBuilder.DropTable( name: "FailingEntities"); diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Cockroach/Migrations/EntitiesContextModelSnapshot.cs b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Cockroach/Migrations/EntitiesContextModelSnapshot.cs index 228b3d3a..f929abe0 100644 --- a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Cockroach/Migrations/EntitiesContextModelSnapshot.cs +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Cockroach/Migrations/EntitiesContextModelSnapshot.cs @@ -38,6 +38,22 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("AutoIncrementPrimaryKeyEntities"); }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.ComposedPrimaryKeyEntity", b => + { + b.Property("PrimaryFirst") + .HasColumnType("integer"); + + b.Property("PrimarySecond") + .HasColumnType("integer"); + + b.Property("Some") + .HasColumnType("text"); + + b.HasKey("PrimaryFirst", "PrimarySecond"); + + b.ToTable("ComposedPrimaryKeyEntities"); + }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.FailingEntity", b => { b.Property("Id") diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.CockroachMulti/Migrations/20220718000516_InitialCreate.Designer.cs b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.CockroachMulti/Migrations/20220718104142_InitialCreate.Designer.cs similarity index 91% rename from EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.CockroachMulti/Migrations/20220718000516_InitialCreate.Designer.cs rename to EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.CockroachMulti/Migrations/20220718104142_InitialCreate.Designer.cs index 75c87938..a143c80a 100644 --- a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.CockroachMulti/Migrations/20220718000516_InitialCreate.Designer.cs +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.CockroachMulti/Migrations/20220718104142_InitialCreate.Designer.cs @@ -12,7 +12,7 @@ namespace EFCore.Extensions.SaveOptimizer.Model.CockroachMulti.Migrations { [DbContext(typeof(EntitiesContext))] - [Migration("20220718000516_InitialCreate")] + [Migration("20220718104142_InitialCreate")] partial class InitialCreate { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -40,6 +40,22 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.ToTable("AutoIncrementPrimaryKeyEntities"); }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.ComposedPrimaryKeyEntity", b => + { + b.Property("PrimaryFirst") + .HasColumnType("integer"); + + b.Property("PrimarySecond") + .HasColumnType("integer"); + + b.Property("Some") + .HasColumnType("text"); + + b.HasKey("PrimaryFirst", "PrimarySecond"); + + b.ToTable("ComposedPrimaryKeyEntities"); + }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.FailingEntity", b => { b.Property("Id") diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.CockroachMulti/Migrations/20220718000516_InitialCreate.cs b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.CockroachMulti/Migrations/20220718104142_InitialCreate.cs similarity index 90% rename from EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.CockroachMulti/Migrations/20220718000516_InitialCreate.cs rename to EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.CockroachMulti/Migrations/20220718104142_InitialCreate.cs index cde7fe23..05a66e98 100644 --- a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.CockroachMulti/Migrations/20220718000516_InitialCreate.cs +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.CockroachMulti/Migrations/20220718104142_InitialCreate.cs @@ -23,6 +23,19 @@ protected override void Up(MigrationBuilder migrationBuilder) table.PrimaryKey("PK_AutoIncrementPrimaryKeyEntities", x => x.Id); }); + migrationBuilder.CreateTable( + name: "ComposedPrimaryKeyEntities", + columns: table => new + { + PrimaryFirst = table.Column(type: "integer", nullable: false), + PrimarySecond = table.Column(type: "integer", nullable: false), + Some = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_ComposedPrimaryKeyEntities", x => new { x.PrimaryFirst, x.PrimarySecond }); + }); + migrationBuilder.CreateTable( name: "FailingEntities", columns: table => new @@ -109,6 +122,9 @@ protected override void Down(MigrationBuilder migrationBuilder) migrationBuilder.DropTable( name: "AutoIncrementPrimaryKeyEntities"); + migrationBuilder.DropTable( + name: "ComposedPrimaryKeyEntities"); + migrationBuilder.DropTable( name: "FailingEntities"); diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.CockroachMulti/Migrations/EntitiesContextModelSnapshot.cs b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.CockroachMulti/Migrations/EntitiesContextModelSnapshot.cs index fb2d2fbf..a305c747 100644 --- a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.CockroachMulti/Migrations/EntitiesContextModelSnapshot.cs +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.CockroachMulti/Migrations/EntitiesContextModelSnapshot.cs @@ -38,6 +38,22 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("AutoIncrementPrimaryKeyEntities"); }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.ComposedPrimaryKeyEntity", b => + { + b.Property("PrimaryFirst") + .HasColumnType("integer"); + + b.Property("PrimarySecond") + .HasColumnType("integer"); + + b.Property("Some") + .HasColumnType("text"); + + b.HasKey("PrimaryFirst", "PrimarySecond"); + + b.ToTable("ComposedPrimaryKeyEntities"); + }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.FailingEntity", b => { b.Property("Id") diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Firebird3/Migrations/20220718000429_InitialCreate.Designer.cs b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Firebird3/Migrations/20220718104140_InitialCreate.Designer.cs similarity index 91% rename from EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Firebird3/Migrations/20220718000429_InitialCreate.Designer.cs rename to EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Firebird3/Migrations/20220718104140_InitialCreate.Designer.cs index 4f7860f6..703c65c8 100644 --- a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Firebird3/Migrations/20220718000429_InitialCreate.Designer.cs +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Firebird3/Migrations/20220718104140_InitialCreate.Designer.cs @@ -12,7 +12,7 @@ namespace EFCore.Extensions.SaveOptimizer.Model.Firebird3.Migrations { [DbContext(typeof(EntitiesContext))] - [Migration("20220718000429_InitialCreate")] + [Migration("20220718104140_InitialCreate")] partial class InitialCreate { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -38,6 +38,22 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.ToTable("AutoIncrementPrimaryKeyEntities"); }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.ComposedPrimaryKeyEntity", b => + { + b.Property("PrimaryFirst") + .HasColumnType("INTEGER"); + + b.Property("PrimarySecond") + .HasColumnType("INTEGER"); + + b.Property("Some") + .HasColumnType("BLOB SUB_TYPE TEXT"); + + b.HasKey("PrimaryFirst", "PrimarySecond"); + + b.ToTable("ComposedPrimaryKeyEntities"); + }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.FailingEntity", b => { b.Property("Id") diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Firebird3/Migrations/20220718000429_InitialCreate.cs b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Firebird3/Migrations/20220718104140_InitialCreate.cs similarity index 89% rename from EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Firebird3/Migrations/20220718000429_InitialCreate.cs rename to EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Firebird3/Migrations/20220718104140_InitialCreate.cs index d67d4c86..bb7fcbe3 100644 --- a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Firebird3/Migrations/20220718000429_InitialCreate.cs +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Firebird3/Migrations/20220718104140_InitialCreate.cs @@ -23,6 +23,19 @@ protected override void Up(MigrationBuilder migrationBuilder) table.PrimaryKey("PK_AutoIncrementPrimaryKeyEnti~", x => x.Id); }); + migrationBuilder.CreateTable( + name: "ComposedPrimaryKeyEntities", + columns: table => new + { + PrimaryFirst = table.Column(type: "INTEGER", nullable: false), + PrimarySecond = table.Column(type: "INTEGER", nullable: false), + Some = table.Column(type: "BLOB SUB_TYPE TEXT", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_ComposedPrimaryKeyEntities", x => new { x.PrimaryFirst, x.PrimarySecond }); + }); + migrationBuilder.CreateTable( name: "FailingEntities", columns: table => new @@ -109,6 +122,9 @@ protected override void Down(MigrationBuilder migrationBuilder) migrationBuilder.DropTable( name: "AutoIncrementPrimaryKeyEntities"); + migrationBuilder.DropTable( + name: "ComposedPrimaryKeyEntities"); + migrationBuilder.DropTable( name: "FailingEntities"); diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Firebird3/Migrations/EntitiesContextModelSnapshot.cs b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Firebird3/Migrations/EntitiesContextModelSnapshot.cs index 08395e46..5b4d49b5 100644 --- a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Firebird3/Migrations/EntitiesContextModelSnapshot.cs +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Firebird3/Migrations/EntitiesContextModelSnapshot.cs @@ -36,6 +36,22 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("AutoIncrementPrimaryKeyEntities"); }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.ComposedPrimaryKeyEntity", b => + { + b.Property("PrimaryFirst") + .HasColumnType("INTEGER"); + + b.Property("PrimarySecond") + .HasColumnType("INTEGER"); + + b.Property("Some") + .HasColumnType("BLOB SUB_TYPE TEXT"); + + b.HasKey("PrimaryFirst", "PrimarySecond"); + + b.ToTable("ComposedPrimaryKeyEntities"); + }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.FailingEntity", b => { b.Property("Id") diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Firebird4/Migrations/20220718000441_InitialCreate.Designer.cs b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Firebird4/Migrations/20220718104140_InitialCreate.Designer.cs similarity index 91% rename from EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Firebird4/Migrations/20220718000441_InitialCreate.Designer.cs rename to EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Firebird4/Migrations/20220718104140_InitialCreate.Designer.cs index 062239b8..95f2939d 100644 --- a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Firebird4/Migrations/20220718000441_InitialCreate.Designer.cs +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Firebird4/Migrations/20220718104140_InitialCreate.Designer.cs @@ -12,7 +12,7 @@ namespace EFCore.Extensions.SaveOptimizer.Model.Firebird4.Migrations { [DbContext(typeof(EntitiesContext))] - [Migration("20220718000441_InitialCreate")] + [Migration("20220718104140_InitialCreate")] partial class InitialCreate { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -38,6 +38,22 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.ToTable("AutoIncrementPrimaryKeyEntities"); }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.ComposedPrimaryKeyEntity", b => + { + b.Property("PrimaryFirst") + .HasColumnType("INTEGER"); + + b.Property("PrimarySecond") + .HasColumnType("INTEGER"); + + b.Property("Some") + .HasColumnType("BLOB SUB_TYPE TEXT"); + + b.HasKey("PrimaryFirst", "PrimarySecond"); + + b.ToTable("ComposedPrimaryKeyEntities"); + }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.FailingEntity", b => { b.Property("Id") diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Firebird4/Migrations/20220718000441_InitialCreate.cs b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Firebird4/Migrations/20220718104140_InitialCreate.cs similarity index 89% rename from EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Firebird4/Migrations/20220718000441_InitialCreate.cs rename to EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Firebird4/Migrations/20220718104140_InitialCreate.cs index 7cfc4087..e65dc6c7 100644 --- a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Firebird4/Migrations/20220718000441_InitialCreate.cs +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Firebird4/Migrations/20220718104140_InitialCreate.cs @@ -23,6 +23,19 @@ protected override void Up(MigrationBuilder migrationBuilder) table.PrimaryKey("PK_AutoIncrementPrimaryKeyEnti~", x => x.Id); }); + migrationBuilder.CreateTable( + name: "ComposedPrimaryKeyEntities", + columns: table => new + { + PrimaryFirst = table.Column(type: "INTEGER", nullable: false), + PrimarySecond = table.Column(type: "INTEGER", nullable: false), + Some = table.Column(type: "BLOB SUB_TYPE TEXT", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_ComposedPrimaryKeyEntities", x => new { x.PrimaryFirst, x.PrimarySecond }); + }); + migrationBuilder.CreateTable( name: "FailingEntities", columns: table => new @@ -109,6 +122,9 @@ protected override void Down(MigrationBuilder migrationBuilder) migrationBuilder.DropTable( name: "AutoIncrementPrimaryKeyEntities"); + migrationBuilder.DropTable( + name: "ComposedPrimaryKeyEntities"); + migrationBuilder.DropTable( name: "FailingEntities"); diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Firebird4/Migrations/EntitiesContextModelSnapshot.cs b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Firebird4/Migrations/EntitiesContextModelSnapshot.cs index cb823cfb..2fd780fd 100644 --- a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Firebird4/Migrations/EntitiesContextModelSnapshot.cs +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Firebird4/Migrations/EntitiesContextModelSnapshot.cs @@ -36,6 +36,22 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("AutoIncrementPrimaryKeyEntities"); }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.ComposedPrimaryKeyEntity", b => + { + b.Property("PrimaryFirst") + .HasColumnType("INTEGER"); + + b.Property("PrimarySecond") + .HasColumnType("INTEGER"); + + b.Property("Some") + .HasColumnType("BLOB SUB_TYPE TEXT"); + + b.HasKey("PrimaryFirst", "PrimarySecond"); + + b.ToTable("ComposedPrimaryKeyEntities"); + }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.FailingEntity", b => { b.Property("Id") diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Oracle/Migrations/20220718000343_InitialCreate.Designer.cs b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Oracle/Migrations/20220718104139_InitialCreate.Designer.cs similarity index 91% rename from EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Oracle/Migrations/20220718000343_InitialCreate.Designer.cs rename to EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Oracle/Migrations/20220718104139_InitialCreate.Designer.cs index 95107c2f..34992db4 100644 --- a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Oracle/Migrations/20220718000343_InitialCreate.Designer.cs +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Oracle/Migrations/20220718104139_InitialCreate.Designer.cs @@ -12,7 +12,7 @@ namespace EFCore.Extensions.SaveOptimizer.Model.Oracle.Migrations { [DbContext(typeof(EntitiesContext))] - [Migration("20220718000343_InitialCreate")] + [Migration("20220718104139_InitialCreate")] partial class InitialCreate { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -40,6 +40,22 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.ToTable("AutoIncrementPrimaryKeyEntities"); }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.ComposedPrimaryKeyEntity", b => + { + b.Property("PrimaryFirst") + .HasColumnType("NUMBER(10)"); + + b.Property("PrimarySecond") + .HasColumnType("NUMBER(10)"); + + b.Property("Some") + .HasColumnType("NVARCHAR2(2000)"); + + b.HasKey("PrimaryFirst", "PrimarySecond"); + + b.ToTable("ComposedPrimaryKeyEntities"); + }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.FailingEntity", b => { b.Property("Id") diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Oracle/Migrations/20220718000343_InitialCreate.cs b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Oracle/Migrations/20220718104139_InitialCreate.cs similarity index 89% rename from EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Oracle/Migrations/20220718000343_InitialCreate.cs rename to EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Oracle/Migrations/20220718104139_InitialCreate.cs index 13ca7128..6e030b24 100644 --- a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Oracle/Migrations/20220718000343_InitialCreate.cs +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Oracle/Migrations/20220718104139_InitialCreate.cs @@ -22,6 +22,19 @@ protected override void Up(MigrationBuilder migrationBuilder) table.PrimaryKey("PK_AutoIncrementPrimaryKeyEntities", x => x.Id); }); + migrationBuilder.CreateTable( + name: "ComposedPrimaryKeyEntities", + columns: table => new + { + PrimaryFirst = table.Column(type: "NUMBER(10)", nullable: false), + PrimarySecond = table.Column(type: "NUMBER(10)", nullable: false), + Some = table.Column(type: "NVARCHAR2(2000)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_ComposedPrimaryKeyEntities", x => new { x.PrimaryFirst, x.PrimarySecond }); + }); + migrationBuilder.CreateTable( name: "FailingEntities", columns: table => new @@ -108,6 +121,9 @@ protected override void Down(MigrationBuilder migrationBuilder) migrationBuilder.DropTable( name: "AutoIncrementPrimaryKeyEntities"); + migrationBuilder.DropTable( + name: "ComposedPrimaryKeyEntities"); + migrationBuilder.DropTable( name: "FailingEntities"); diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Oracle/Migrations/EntitiesContextModelSnapshot.cs b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Oracle/Migrations/EntitiesContextModelSnapshot.cs index 55377205..8e66ab36 100644 --- a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Oracle/Migrations/EntitiesContextModelSnapshot.cs +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Oracle/Migrations/EntitiesContextModelSnapshot.cs @@ -38,6 +38,22 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("AutoIncrementPrimaryKeyEntities"); }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.ComposedPrimaryKeyEntity", b => + { + b.Property("PrimaryFirst") + .HasColumnType("NUMBER(10)"); + + b.Property("PrimarySecond") + .HasColumnType("NUMBER(10)"); + + b.Property("Some") + .HasColumnType("NVARCHAR2(2000)"); + + b.HasKey("PrimaryFirst", "PrimarySecond"); + + b.ToTable("ComposedPrimaryKeyEntities"); + }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.FailingEntity", b => { b.Property("Id") diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.PomeloMariaDb/Migrations/20220718000453_InitialCreate.Designer.cs b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.PomeloMariaDb/Migrations/20220718104145_InitialCreate.Designer.cs similarity index 91% rename from EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.PomeloMariaDb/Migrations/20220718000453_InitialCreate.Designer.cs rename to EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.PomeloMariaDb/Migrations/20220718104145_InitialCreate.Designer.cs index fe448de0..8eff0022 100644 --- a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.PomeloMariaDb/Migrations/20220718000453_InitialCreate.Designer.cs +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.PomeloMariaDb/Migrations/20220718104145_InitialCreate.Designer.cs @@ -11,7 +11,7 @@ namespace EFCore.Extensions.SaveOptimizer.Model.PomeloMariaDb.Migrations { [DbContext(typeof(EntitiesContext))] - [Migration("20220718000453_InitialCreate")] + [Migration("20220718104145_InitialCreate")] partial class InitialCreate { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -35,6 +35,22 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.ToTable("AutoIncrementPrimaryKeyEntities"); }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.ComposedPrimaryKeyEntity", b => + { + b.Property("PrimaryFirst") + .HasColumnType("int"); + + b.Property("PrimarySecond") + .HasColumnType("int"); + + b.Property("Some") + .HasColumnType("longtext"); + + b.HasKey("PrimaryFirst", "PrimarySecond"); + + b.ToTable("ComposedPrimaryKeyEntities"); + }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.FailingEntity", b => { b.Property("Id") diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.PomeloMariaDb/Migrations/20220718000453_InitialCreate.cs b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.PomeloMariaDb/Migrations/20220718104145_InitialCreate.cs similarity index 89% rename from EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.PomeloMariaDb/Migrations/20220718000453_InitialCreate.cs rename to EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.PomeloMariaDb/Migrations/20220718104145_InitialCreate.cs index d9069093..b4a0b659 100644 --- a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.PomeloMariaDb/Migrations/20220718000453_InitialCreate.cs +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.PomeloMariaDb/Migrations/20220718104145_InitialCreate.cs @@ -28,6 +28,21 @@ protected override void Up(MigrationBuilder migrationBuilder) }) .Annotation("MySql:CharSet", "utf8mb4"); + migrationBuilder.CreateTable( + name: "ComposedPrimaryKeyEntities", + columns: table => new + { + PrimaryFirst = table.Column(type: "int", nullable: false), + PrimarySecond = table.Column(type: "int", nullable: false), + Some = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4") + }, + constraints: table => + { + table.PrimaryKey("PK_ComposedPrimaryKeyEntities", x => new { x.PrimaryFirst, x.PrimarySecond }); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + migrationBuilder.CreateTable( name: "FailingEntities", columns: table => new @@ -123,6 +138,9 @@ protected override void Down(MigrationBuilder migrationBuilder) migrationBuilder.DropTable( name: "AutoIncrementPrimaryKeyEntities"); + migrationBuilder.DropTable( + name: "ComposedPrimaryKeyEntities"); + migrationBuilder.DropTable( name: "FailingEntities"); diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.PomeloMariaDb/Migrations/EntitiesContextModelSnapshot.cs b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.PomeloMariaDb/Migrations/EntitiesContextModelSnapshot.cs index 3ee4232d..61c135b1 100644 --- a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.PomeloMariaDb/Migrations/EntitiesContextModelSnapshot.cs +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.PomeloMariaDb/Migrations/EntitiesContextModelSnapshot.cs @@ -33,6 +33,22 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("AutoIncrementPrimaryKeyEntities"); }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.ComposedPrimaryKeyEntity", b => + { + b.Property("PrimaryFirst") + .HasColumnType("int"); + + b.Property("PrimarySecond") + .HasColumnType("int"); + + b.Property("Some") + .HasColumnType("longtext"); + + b.HasKey("PrimaryFirst", "PrimarySecond"); + + b.ToTable("ComposedPrimaryKeyEntities"); + }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.FailingEntity", b => { b.Property("Id") diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.PomeloMySql/Migrations/20220718000418_InitialCreate.Designer.cs b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.PomeloMySql/Migrations/20220718104144_InitialCreate.Designer.cs similarity index 91% rename from EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.PomeloMySql/Migrations/20220718000418_InitialCreate.Designer.cs rename to EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.PomeloMySql/Migrations/20220718104144_InitialCreate.Designer.cs index 599d3614..c704cbeb 100644 --- a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.PomeloMySql/Migrations/20220718000418_InitialCreate.Designer.cs +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.PomeloMySql/Migrations/20220718104144_InitialCreate.Designer.cs @@ -11,7 +11,7 @@ namespace EFCore.Extensions.SaveOptimizer.Model.PomeloMySql.Migrations { [DbContext(typeof(EntitiesContext))] - [Migration("20220718000418_InitialCreate")] + [Migration("20220718104144_InitialCreate")] partial class InitialCreate { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -35,6 +35,22 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.ToTable("AutoIncrementPrimaryKeyEntities"); }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.ComposedPrimaryKeyEntity", b => + { + b.Property("PrimaryFirst") + .HasColumnType("int"); + + b.Property("PrimarySecond") + .HasColumnType("int"); + + b.Property("Some") + .HasColumnType("longtext"); + + b.HasKey("PrimaryFirst", "PrimarySecond"); + + b.ToTable("ComposedPrimaryKeyEntities"); + }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.FailingEntity", b => { b.Property("Id") diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.PomeloMySql/Migrations/20220718000418_InitialCreate.cs b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.PomeloMySql/Migrations/20220718104144_InitialCreate.cs similarity index 89% rename from EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.PomeloMySql/Migrations/20220718000418_InitialCreate.cs rename to EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.PomeloMySql/Migrations/20220718104144_InitialCreate.cs index f211881a..39fced86 100644 --- a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.PomeloMySql/Migrations/20220718000418_InitialCreate.cs +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.PomeloMySql/Migrations/20220718104144_InitialCreate.cs @@ -28,6 +28,21 @@ protected override void Up(MigrationBuilder migrationBuilder) }) .Annotation("MySql:CharSet", "utf8mb4"); + migrationBuilder.CreateTable( + name: "ComposedPrimaryKeyEntities", + columns: table => new + { + PrimaryFirst = table.Column(type: "int", nullable: false), + PrimarySecond = table.Column(type: "int", nullable: false), + Some = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4") + }, + constraints: table => + { + table.PrimaryKey("PK_ComposedPrimaryKeyEntities", x => new { x.PrimaryFirst, x.PrimarySecond }); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + migrationBuilder.CreateTable( name: "FailingEntities", columns: table => new @@ -123,6 +138,9 @@ protected override void Down(MigrationBuilder migrationBuilder) migrationBuilder.DropTable( name: "AutoIncrementPrimaryKeyEntities"); + migrationBuilder.DropTable( + name: "ComposedPrimaryKeyEntities"); + migrationBuilder.DropTable( name: "FailingEntities"); diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.PomeloMySql/Migrations/EntitiesContextModelSnapshot.cs b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.PomeloMySql/Migrations/EntitiesContextModelSnapshot.cs index af952dfa..0944be0d 100644 --- a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.PomeloMySql/Migrations/EntitiesContextModelSnapshot.cs +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.PomeloMySql/Migrations/EntitiesContextModelSnapshot.cs @@ -33,6 +33,22 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("AutoIncrementPrimaryKeyEntities"); }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.ComposedPrimaryKeyEntity", b => + { + b.Property("PrimaryFirst") + .HasColumnType("int"); + + b.Property("PrimarySecond") + .HasColumnType("int"); + + b.Property("Some") + .HasColumnType("longtext"); + + b.HasKey("PrimaryFirst", "PrimarySecond"); + + b.ToTable("ComposedPrimaryKeyEntities"); + }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.FailingEntity", b => { b.Property("Id") diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Postgres/Migrations/20220718000406_InitialCreate.Designer.cs b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Postgres/Migrations/20220718104140_InitialCreate.Designer.cs similarity index 91% rename from EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Postgres/Migrations/20220718000406_InitialCreate.Designer.cs rename to EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Postgres/Migrations/20220718104140_InitialCreate.Designer.cs index 41210da0..8b5a6c83 100644 --- a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Postgres/Migrations/20220718000406_InitialCreate.Designer.cs +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Postgres/Migrations/20220718104140_InitialCreate.Designer.cs @@ -12,7 +12,7 @@ namespace EFCore.Extensions.SaveOptimizer.Model.Postgres.Migrations { [DbContext(typeof(EntitiesContext))] - [Migration("20220718000406_InitialCreate")] + [Migration("20220718104140_InitialCreate")] partial class InitialCreate { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -40,6 +40,22 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.ToTable("AutoIncrementPrimaryKeyEntities"); }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.ComposedPrimaryKeyEntity", b => + { + b.Property("PrimaryFirst") + .HasColumnType("integer"); + + b.Property("PrimarySecond") + .HasColumnType("integer"); + + b.Property("Some") + .HasColumnType("text"); + + b.HasKey("PrimaryFirst", "PrimarySecond"); + + b.ToTable("ComposedPrimaryKeyEntities"); + }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.FailingEntity", b => { b.Property("Id") diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Postgres/Migrations/20220718000406_InitialCreate.cs b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Postgres/Migrations/20220718104140_InitialCreate.cs similarity index 90% rename from EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Postgres/Migrations/20220718000406_InitialCreate.cs rename to EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Postgres/Migrations/20220718104140_InitialCreate.cs index 4cc791a0..e93037b1 100644 --- a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Postgres/Migrations/20220718000406_InitialCreate.cs +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Postgres/Migrations/20220718104140_InitialCreate.cs @@ -23,6 +23,19 @@ protected override void Up(MigrationBuilder migrationBuilder) table.PrimaryKey("PK_AutoIncrementPrimaryKeyEntities", x => x.Id); }); + migrationBuilder.CreateTable( + name: "ComposedPrimaryKeyEntities", + columns: table => new + { + PrimaryFirst = table.Column(type: "integer", nullable: false), + PrimarySecond = table.Column(type: "integer", nullable: false), + Some = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_ComposedPrimaryKeyEntities", x => new { x.PrimaryFirst, x.PrimarySecond }); + }); + migrationBuilder.CreateTable( name: "FailingEntities", columns: table => new @@ -109,6 +122,9 @@ protected override void Down(MigrationBuilder migrationBuilder) migrationBuilder.DropTable( name: "AutoIncrementPrimaryKeyEntities"); + migrationBuilder.DropTable( + name: "ComposedPrimaryKeyEntities"); + migrationBuilder.DropTable( name: "FailingEntities"); diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Postgres/Migrations/EntitiesContextModelSnapshot.cs b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Postgres/Migrations/EntitiesContextModelSnapshot.cs index 91bb1bbf..862c0115 100644 --- a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Postgres/Migrations/EntitiesContextModelSnapshot.cs +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Postgres/Migrations/EntitiesContextModelSnapshot.cs @@ -38,6 +38,22 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("AutoIncrementPrimaryKeyEntities"); }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.ComposedPrimaryKeyEntity", b => + { + b.Property("PrimaryFirst") + .HasColumnType("integer"); + + b.Property("PrimarySecond") + .HasColumnType("integer"); + + b.Property("Some") + .HasColumnType("text"); + + b.HasKey("PrimaryFirst", "PrimarySecond"); + + b.ToTable("ComposedPrimaryKeyEntities"); + }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.FailingEntity", b => { b.Property("Id") diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.SqlServer/Migrations/20220718000330_InitialCreate.Designer.cs b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.SqlServer/Migrations/20220718104138_InitialCreate.Designer.cs similarity index 91% rename from EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.SqlServer/Migrations/20220718000330_InitialCreate.Designer.cs rename to EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.SqlServer/Migrations/20220718104138_InitialCreate.Designer.cs index 6269cc77..46d5957d 100644 --- a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.SqlServer/Migrations/20220718000330_InitialCreate.Designer.cs +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.SqlServer/Migrations/20220718104138_InitialCreate.Designer.cs @@ -12,7 +12,7 @@ namespace EFCore.Extensions.SaveOptimizer.Model.SqlServer.Migrations { [DbContext(typeof(EntitiesContext))] - [Migration("20220718000330_InitialCreate")] + [Migration("20220718104138_InitialCreate")] partial class InitialCreate { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -40,6 +40,22 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.ToTable("AutoIncrementPrimaryKeyEntities"); }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.ComposedPrimaryKeyEntity", b => + { + b.Property("PrimaryFirst") + .HasColumnType("int"); + + b.Property("PrimarySecond") + .HasColumnType("int"); + + b.Property("Some") + .HasColumnType("nvarchar(max)"); + + b.HasKey("PrimaryFirst", "PrimarySecond"); + + b.ToTable("ComposedPrimaryKeyEntities"); + }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.FailingEntity", b => { b.Property("Id") diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.SqlServer/Migrations/20220718000330_InitialCreate.cs b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.SqlServer/Migrations/20220718104138_InitialCreate.cs similarity index 89% rename from EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.SqlServer/Migrations/20220718000330_InitialCreate.cs rename to EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.SqlServer/Migrations/20220718104138_InitialCreate.cs index 538b4ad5..9721c0b2 100644 --- a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.SqlServer/Migrations/20220718000330_InitialCreate.cs +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.SqlServer/Migrations/20220718104138_InitialCreate.cs @@ -22,6 +22,19 @@ protected override void Up(MigrationBuilder migrationBuilder) table.PrimaryKey("PK_AutoIncrementPrimaryKeyEntities", x => x.Id); }); + migrationBuilder.CreateTable( + name: "ComposedPrimaryKeyEntities", + columns: table => new + { + PrimaryFirst = table.Column(type: "int", nullable: false), + PrimarySecond = table.Column(type: "int", nullable: false), + Some = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_ComposedPrimaryKeyEntities", x => new { x.PrimaryFirst, x.PrimarySecond }); + }); + migrationBuilder.CreateTable( name: "FailingEntities", columns: table => new @@ -108,6 +121,9 @@ protected override void Down(MigrationBuilder migrationBuilder) migrationBuilder.DropTable( name: "AutoIncrementPrimaryKeyEntities"); + migrationBuilder.DropTable( + name: "ComposedPrimaryKeyEntities"); + migrationBuilder.DropTable( name: "FailingEntities"); diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.SqlServer/Migrations/EntitiesContextModelSnapshot.cs b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.SqlServer/Migrations/EntitiesContextModelSnapshot.cs index 75376cf1..3561a4ec 100644 --- a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.SqlServer/Migrations/EntitiesContextModelSnapshot.cs +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.SqlServer/Migrations/EntitiesContextModelSnapshot.cs @@ -38,6 +38,22 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("AutoIncrementPrimaryKeyEntities"); }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.ComposedPrimaryKeyEntity", b => + { + b.Property("PrimaryFirst") + .HasColumnType("int"); + + b.Property("PrimarySecond") + .HasColumnType("int"); + + b.Property("Some") + .HasColumnType("nvarchar(max)"); + + b.HasKey("PrimaryFirst", "PrimarySecond"); + + b.ToTable("ComposedPrimaryKeyEntities"); + }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.FailingEntity", b => { b.Property("Id") diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Sqlite/Migrations/20220718000354_InitialCreate.Designer.cs b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Sqlite/Migrations/20220718104141_InitialCreate.Designer.cs similarity index 91% rename from EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Sqlite/Migrations/20220718000354_InitialCreate.Designer.cs rename to EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Sqlite/Migrations/20220718104141_InitialCreate.Designer.cs index 98ed249d..e4fa4579 100644 --- a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Sqlite/Migrations/20220718000354_InitialCreate.Designer.cs +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Sqlite/Migrations/20220718104141_InitialCreate.Designer.cs @@ -11,7 +11,7 @@ namespace EFCore.Extensions.SaveOptimizer.Model.Sqlite.Migrations { [DbContext(typeof(EntitiesContext))] - [Migration("20220718000354_InitialCreate")] + [Migration("20220718104141_InitialCreate")] partial class InitialCreate { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -33,6 +33,22 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.ToTable("AutoIncrementPrimaryKeyEntities"); }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.ComposedPrimaryKeyEntity", b => + { + b.Property("PrimaryFirst") + .HasColumnType("INTEGER"); + + b.Property("PrimarySecond") + .HasColumnType("INTEGER"); + + b.Property("Some") + .HasColumnType("TEXT"); + + b.HasKey("PrimaryFirst", "PrimarySecond"); + + b.ToTable("ComposedPrimaryKeyEntities"); + }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.FailingEntity", b => { b.Property("Id") diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Sqlite/Migrations/20220718000354_InitialCreate.cs b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Sqlite/Migrations/20220718104141_InitialCreate.cs similarity index 89% rename from EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Sqlite/Migrations/20220718000354_InitialCreate.cs rename to EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Sqlite/Migrations/20220718104141_InitialCreate.cs index 54b59f2b..e7caafbe 100644 --- a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Sqlite/Migrations/20220718000354_InitialCreate.cs +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Sqlite/Migrations/20220718104141_InitialCreate.cs @@ -22,6 +22,19 @@ protected override void Up(MigrationBuilder migrationBuilder) table.PrimaryKey("PK_AutoIncrementPrimaryKeyEntities", x => x.Id); }); + migrationBuilder.CreateTable( + name: "ComposedPrimaryKeyEntities", + columns: table => new + { + PrimaryFirst = table.Column(type: "INTEGER", nullable: false), + PrimarySecond = table.Column(type: "INTEGER", nullable: false), + Some = table.Column(type: "TEXT", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_ComposedPrimaryKeyEntities", x => new { x.PrimaryFirst, x.PrimarySecond }); + }); + migrationBuilder.CreateTable( name: "FailingEntities", columns: table => new @@ -108,6 +121,9 @@ protected override void Down(MigrationBuilder migrationBuilder) migrationBuilder.DropTable( name: "AutoIncrementPrimaryKeyEntities"); + migrationBuilder.DropTable( + name: "ComposedPrimaryKeyEntities"); + migrationBuilder.DropTable( name: "FailingEntities"); diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Sqlite/Migrations/EntitiesContextModelSnapshot.cs b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Sqlite/Migrations/EntitiesContextModelSnapshot.cs index 3560d327..cd9a98c8 100644 --- a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Sqlite/Migrations/EntitiesContextModelSnapshot.cs +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model.Sqlite/Migrations/EntitiesContextModelSnapshot.cs @@ -31,6 +31,22 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("AutoIncrementPrimaryKeyEntities"); }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.ComposedPrimaryKeyEntity", b => + { + b.Property("PrimaryFirst") + .HasColumnType("INTEGER"); + + b.Property("PrimarySecond") + .HasColumnType("INTEGER"); + + b.Property("Some") + .HasColumnType("TEXT"); + + b.HasKey("PrimaryFirst", "PrimarySecond"); + + b.ToTable("ComposedPrimaryKeyEntities"); + }); + modelBuilder.Entity("EFCore.Extensions.SaveOptimizer.Model.Entities.FailingEntity", b => { b.Property("Id") diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model/Context/EntitiesContext.cs b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model/Context/EntitiesContext.cs index 1830a6af..65f6dd26 100644 --- a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model/Context/EntitiesContext.cs +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model/Context/EntitiesContext.cs @@ -20,6 +20,8 @@ public class EntitiesContext : DbContext public DbSet ValueConverterEntities { get; set; } + public DbSet ComposedPrimaryKeyEntities { get; set; } + public EntitiesContext(DbContextOptions options) : base(options) { @@ -35,6 +37,9 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) .Property(x => x.SomeHalf) .HasConversion(); + modelBuilder.Entity() + .HasKey(x => new { x.PrimaryFirst, x.PrimarySecond }); + foreach (Action builder in AdditionalBuilders) { builder(modelBuilder); diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model/Entities/ComposedPrimaryKeyEntity.cs b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model/Entities/ComposedPrimaryKeyEntity.cs new file mode 100644 index 00000000..613eec2e --- /dev/null +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Model/Entities/ComposedPrimaryKeyEntity.cs @@ -0,0 +1,17 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace EFCore.Extensions.SaveOptimizer.Model.Entities; + +public class ComposedPrimaryKeyEntity +{ + [DatabaseGenerated(DatabaseGeneratedOption.None)] + [Required] + public int? PrimaryFirst { get; set; } + + [DatabaseGenerated(DatabaseGeneratedOption.None)] + [Required] + public int? PrimarySecond { get; set; } + + public string? Some { get; set; } +} diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Shared.Tests/EFCore.Extensions.SaveOptimizer.Shared.Tests.csproj b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Shared.Tests/EFCore.Extensions.SaveOptimizer.Shared.Tests.csproj index 3467a5df..0fa8d14c 100644 --- a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Shared.Tests/EFCore.Extensions.SaveOptimizer.Shared.Tests.csproj +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Shared.Tests/EFCore.Extensions.SaveOptimizer.Shared.Tests.csproj @@ -8,6 +8,12 @@ false + + + Always + + + diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Shared.Tests/Properties/AssemblyInfo.cs b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Shared.Tests/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..e38d6e84 --- /dev/null +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Shared.Tests/Properties/AssemblyInfo.cs @@ -0,0 +1 @@ +[assembly: CollectionBehavior(CollectionBehavior.CollectionPerAssembly)] diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Shared.Tests/Tests/BaseComposedPrimaryKeyTests.cs b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Shared.Tests/Tests/BaseComposedPrimaryKeyTests.cs new file mode 100644 index 00000000..6779cf06 --- /dev/null +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Shared.Tests/Tests/BaseComposedPrimaryKeyTests.cs @@ -0,0 +1,307 @@ +using EFCore.Extensions.SaveOptimizer.Model.Entities; +using EFCore.Extensions.SaveOptimizer.Shared.Tests.Attributes; +using EFCore.Extensions.SaveOptimizer.Shared.Tests.Enums; +using EFCore.Extensions.SaveOptimizer.Shared.Tests.Extensions; +using EFCore.Extensions.SaveOptimizer.Shared.Tests.Wrappers; + +namespace EFCore.Extensions.SaveOptimizer.Shared.Tests.Tests; + +public abstract partial class BaseMiscTests +{ + [SkippableTheory] + [MemberData(nameof(BaseWriteTheoryData))] + public async Task GivenSaveChangesAsync_WhenInsertComposedPrimaryKey_ShouldStoreData(SaveVariant variant) + { + // Arrange + using DbContextWrapper db = ContextWrapperResolver(); + + ComposedPrimaryKeyEntity[] data = + { + new() { PrimaryFirst = 1, PrimarySecond = 1, Some = "some-1" }, + new() { PrimaryFirst = 1, PrimarySecond = 2, Some = "some-2" }, + new() { PrimaryFirst = 2, PrimarySecond = 1, Some = "some-3" }, + new() { PrimaryFirst = 2, PrimarySecond = 2, Some = "some-4" } + }; + + await db.Context.AddRangeAsync(data as IEnumerable).ConfigureAwait(false); + + // Act + await db.SaveAsync(variant, null).ConfigureAwait(false); + + ComposedPrimaryKeyEntity[] result = await db.Context.ComposedPrimaryKeyEntities + .OrderBy(x => x.PrimaryFirst) + .ThenBy(x => x.PrimarySecond) + .ToArrayWithRetryAsync() + .ConfigureAwait(false); + + // Assert + result.Should().HaveCount(4); + + result[0].PrimaryFirst.Should().Be(1); + result[0].PrimarySecond.Should().Be(1); + result[0].Some.Should().Be("some-1"); + + result[1].PrimaryFirst.Should().Be(1); + result[1].PrimarySecond.Should().Be(2); + result[1].Some.Should().Be("some-2"); + + result[2].PrimaryFirst.Should().Be(2); + result[2].PrimarySecond.Should().Be(1); + result[2].Some.Should().Be("some-3"); + + result[3].PrimaryFirst.Should().Be(2); + result[3].PrimarySecond.Should().Be(2); + result[3].Some.Should().Be("some-4"); + } + + [SkippableTheory] + [MemberData(nameof(BaseWriteTheoryData))] + public async Task GivenSaveChangesAsync_WhenUpdateComposedPrimaryKey_ShouldStoreData(SaveVariant variant) + { + // Arrange + using DbContextWrapper db = ContextWrapperResolver(); + + ComposedPrimaryKeyEntity[] data = + { + new() { PrimaryFirst = 1, PrimarySecond = 1 }, new() { PrimaryFirst = 1, PrimarySecond = 2 }, + new() { PrimaryFirst = 2, PrimarySecond = 1 }, new() { PrimaryFirst = 2, PrimarySecond = 2 } + }; + + await db.Context.AddRangeAsync(data as IEnumerable).ConfigureAwait(false); + + await db.SaveAsync(variant, null).ConfigureAwait(false); + + data = await db.Context.ComposedPrimaryKeyEntities + .OrderBy(x => x.PrimaryFirst) + .ThenBy(x => x.PrimarySecond) + .ToArrayWithRetryAsync() + .ConfigureAwait(false); + + data[0].Some = "some-1"; + data[1].Some = "some-2"; + data[2].Some = "some-3"; + data[3].Some = "some-4"; + + // Act + await db.SaveAsync(variant, null).ConfigureAwait(false); + + ComposedPrimaryKeyEntity[] result = await db.Context.ComposedPrimaryKeyEntities + .OrderBy(x => x.PrimaryFirst) + .ThenBy(x => x.PrimarySecond) + .ToArrayWithRetryAsync() + .ConfigureAwait(false); + + // Assert + result.Should().HaveCount(4); + + result[0].PrimaryFirst.Should().Be(1); + result[0].PrimarySecond.Should().Be(1); + result[0].Some.Should().Be("some-1"); + + result[1].PrimaryFirst.Should().Be(1); + result[1].PrimarySecond.Should().Be(2); + result[1].Some.Should().Be("some-2"); + + result[2].PrimaryFirst.Should().Be(2); + result[2].PrimarySecond.Should().Be(1); + result[2].Some.Should().Be("some-3"); + + result[3].PrimaryFirst.Should().Be(2); + result[3].PrimarySecond.Should().Be(2); + result[3].Some.Should().Be("some-4"); + } + + [SkippableTheory] + [MemberData(nameof(BaseWriteTheoryData))] + public async Task GivenSaveChangesAsync_WhenDeleteComposedPrimaryKey_ShouldStoreData(SaveVariant variant) + { + // Arrange + using DbContextWrapper db = ContextWrapperResolver(); + + ComposedPrimaryKeyEntity[] data = + { + new() { PrimaryFirst = 1, PrimarySecond = 1, Some = "some-1" }, + new() { PrimaryFirst = 1, PrimarySecond = 2, Some = "some-2" }, + new() { PrimaryFirst = 2, PrimarySecond = 1, Some = "some-3" }, + new() { PrimaryFirst = 2, PrimarySecond = 2, Some = "some-4" } + }; + + await db.Context.AddRangeAsync(data as IEnumerable).ConfigureAwait(false); + + await db.SaveAsync(variant, null).ConfigureAwait(false); + + data = await db.Context.ComposedPrimaryKeyEntities + .OrderBy(x => x.PrimaryFirst) + .ThenBy(x => x.PrimarySecond) + .ToArrayWithRetryAsync() + .ConfigureAwait(false); + + db.Context.RemoveRange(data[0], data[2]); + + // Act + await db.SaveAsync(variant, null).ConfigureAwait(false); + + ComposedPrimaryKeyEntity[] result = await db.Context.ComposedPrimaryKeyEntities + .OrderBy(x => x.PrimaryFirst) + .ThenBy(x => x.PrimarySecond) + .ToArrayWithRetryAsync() + .ConfigureAwait(false); + + // Assert + result.Should().HaveCount(2); + + result[0].PrimaryFirst.Should().Be(1); + result[0].PrimarySecond.Should().Be(2); + result[0].Some.Should().Be("some-2"); + + result[1].PrimaryFirst.Should().Be(2); + result[1].PrimarySecond.Should().Be(2); + result[1].Some.Should().Be("some-4"); + } + + [SkippableTheory] + [MemberData(nameof(BaseWriteTheoryData))] + public void GivenSaveChanges_WhenInsertComposedPrimaryKey_ShouldStoreData(SaveVariant variant) + { + // Arrange + using DbContextWrapper db = ContextWrapperResolver(); + + ComposedPrimaryKeyEntity[] data = + { + new() { PrimaryFirst = 1, PrimarySecond = 1, Some = "some-1" }, + new() { PrimaryFirst = 1, PrimarySecond = 2, Some = "some-2" }, + new() { PrimaryFirst = 2, PrimarySecond = 1, Some = "some-3" }, + new() { PrimaryFirst = 2, PrimarySecond = 2, Some = "some-4" } + }; + + db.Context.AddRange(data as IEnumerable); + + // Act + db.Save(variant, null); + + ComposedPrimaryKeyEntity[] result = db.Context.ComposedPrimaryKeyEntities + .OrderBy(x => x.PrimaryFirst) + .ThenBy(x => x.PrimarySecond) + .ToArrayWithRetry(); + + // Assert + result.Should().HaveCount(4); + + result[0].PrimaryFirst.Should().Be(1); + result[0].PrimarySecond.Should().Be(1); + result[0].Some.Should().Be("some-1"); + + result[1].PrimaryFirst.Should().Be(1); + result[1].PrimarySecond.Should().Be(2); + result[1].Some.Should().Be("some-2"); + + result[2].PrimaryFirst.Should().Be(2); + result[2].PrimarySecond.Should().Be(1); + result[2].Some.Should().Be("some-3"); + + result[3].PrimaryFirst.Should().Be(2); + result[3].PrimarySecond.Should().Be(2); + result[3].Some.Should().Be("some-4"); + } + + [SkippableTheory] + [MemberData(nameof(BaseWriteTheoryData))] + public void GivenSaveChanges_WhenUpdateComposedPrimaryKey_ShouldStoreData(SaveVariant variant) + { + // Arrange + using DbContextWrapper db = ContextWrapperResolver(); + + ComposedPrimaryKeyEntity[] data = + { + new() { PrimaryFirst = 1, PrimarySecond = 1 }, new() { PrimaryFirst = 1, PrimarySecond = 2 }, + new() { PrimaryFirst = 2, PrimarySecond = 1 }, new() { PrimaryFirst = 2, PrimarySecond = 2 } + }; + + db.Context.AddRange(data as IEnumerable); + + db.Save(variant, null); + + data = db.Context.ComposedPrimaryKeyEntities + .OrderBy(x => x.PrimaryFirst) + .ThenBy(x => x.PrimarySecond) + .ToArrayWithRetry(); + + data[0].Some = "some-1"; + data[1].Some = "some-2"; + data[2].Some = "some-3"; + data[3].Some = "some-4"; + + // Act + db.Save(variant, null); + + ComposedPrimaryKeyEntity[] result = db.Context.ComposedPrimaryKeyEntities + .OrderBy(x => x.PrimaryFirst) + .ThenBy(x => x.PrimarySecond) + .ToArrayWithRetry(); + + // Assert + result.Should().HaveCount(4); + + result[0].PrimaryFirst.Should().Be(1); + result[0].PrimarySecond.Should().Be(1); + result[0].Some.Should().Be("some-1"); + + result[1].PrimaryFirst.Should().Be(1); + result[1].PrimarySecond.Should().Be(2); + result[1].Some.Should().Be("some-2"); + + result[2].PrimaryFirst.Should().Be(2); + result[2].PrimarySecond.Should().Be(1); + result[2].Some.Should().Be("some-3"); + + result[3].PrimaryFirst.Should().Be(2); + result[3].PrimarySecond.Should().Be(2); + result[3].Some.Should().Be("some-4"); + } + + [SkippableTheory] + [MemberData(nameof(BaseWriteTheoryData))] + public void GivenSaveChanges_WhenDeleteComposedPrimaryKey_ShouldStoreData(SaveVariant variant) + { + // Arrange + using DbContextWrapper db = ContextWrapperResolver(); + + ComposedPrimaryKeyEntity[] data = + { + new() { PrimaryFirst = 1, PrimarySecond = 1, Some = "some-1" }, + new() { PrimaryFirst = 1, PrimarySecond = 2, Some = "some-2" }, + new() { PrimaryFirst = 2, PrimarySecond = 1, Some = "some-3" }, + new() { PrimaryFirst = 2, PrimarySecond = 2, Some = "some-4" } + }; + + db.Context.AddRange(data as IEnumerable); + + db.Save(variant, null); + + data = db.Context.ComposedPrimaryKeyEntities + .OrderBy(x => x.PrimaryFirst) + .ThenBy(x => x.PrimarySecond) + .ToArrayWithRetry(); + + db.Context.RemoveRange(data[0], data[2]); + + // Act + db.Save(variant, null); + + ComposedPrimaryKeyEntity[] result = db.Context.ComposedPrimaryKeyEntities + .OrderBy(x => x.PrimaryFirst) + .ThenBy(x => x.PrimarySecond) + .ToArrayWithRetry(); + + // Assert + result.Should().HaveCount(2); + + result[0].PrimaryFirst.Should().Be(1); + result[0].PrimarySecond.Should().Be(2); + result[0].Some.Should().Be("some-2"); + + result[1].PrimaryFirst.Should().Be(2); + result[1].PrimarySecond.Should().Be(2); + result[1].Some.Should().Be("some-4"); + } +} diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Shared.Tests/Wrappers/DbContextWrapper.cs b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Shared.Tests/Wrappers/DbContextWrapper.cs index 1ad10616..b51e0fe5 100644 --- a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Shared.Tests/Wrappers/DbContextWrapper.cs +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.Shared.Tests/Wrappers/DbContextWrapper.cs @@ -31,7 +31,8 @@ public sealed class DbContextWrapper : IDisposable public string[] EntitiesList { get; } = { nameof(EntitiesContext.NonRelatedEntities), nameof(EntitiesContext.AutoIncrementPrimaryKeyEntities), - nameof(EntitiesContext.VariousTypeEntities), nameof(EntitiesContext.FailingEntities), nameof(EntitiesContext.ValueConverterEntities) + nameof(EntitiesContext.VariousTypeEntities), nameof(EntitiesContext.FailingEntities), + nameof(EntitiesContext.ValueConverterEntities), nameof(EntitiesContext.ComposedPrimaryKeyEntities) }; public Dictionary SequencesList { get; } = new() diff --git a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.sln b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.sln index 68ccb17e..33e8e47e 100644 --- a/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.sln +++ b/EFCore.Extensions.SaveOptimizer/EFCore.Extensions.SaveOptimizer.sln @@ -8,6 +8,8 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{F90166D1-E132-43F9-A1F1-BB5B385F1D06}" ProjectSection(SolutionItems) = preProject .editorconfig = .editorconfig + .runsettings = .runsettings + xunit.runner.json = xunit.runner.json EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EFCore.Extensions.SaveOptimizer.Model", "EFCore.Extensions.SaveOptimizer.Model\EFCore.Extensions.SaveOptimizer.Model.csproj", "{AEF69D42-0770-45A9-9185-B1751D1B8EB2}" diff --git a/EFCore.Extensions.SaveOptimizer/xunit.runner.json b/EFCore.Extensions.SaveOptimizer/xunit.runner.json new file mode 100644 index 00000000..064d8713 --- /dev/null +++ b/EFCore.Extensions.SaveOptimizer/xunit.runner.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://xunit.net/schema/current/xunit.runner.schema.json", + "parallelizeAssembly": true, + "parallelizeTestCollections": true, + "maxParallelThreads": 16 +} diff --git a/README.md b/README.md index a5a526f3..8b0cfb7f 100644 --- a/README.md +++ b/README.md @@ -78,7 +78,7 @@ Please note it is not working exactly as SaveChanges, so you should verify it wo - [x] [FirebirdSql.EntityFrameworkCore.Firebird](https://www.nuget.org/packages/FirebirdSql.EntityFrameworkCore.Firebird/) - [ ] Primary keys - [x] Simple - - [ ] Composed + - [x] Composed - [ ] No primary key - [x] Statements - [x] Insert @@ -98,6 +98,7 @@ Please note it is not working exactly as SaveChanges, so you should verify it wo - [ ] Interceptors - [ ] Shadow properties - [ ] Self-referencing relationship +- [ ] Alternate keys - [x] [Configuration](#configuration) - [ ] Concurrency token support - [x] Where clause @@ -108,6 +109,7 @@ Please note it is not working exactly as SaveChanges, so you should verify it wo - [ ] Add unchecked when possible - [ ] Low level performance optimizations - [ ] Contributing document +- [ ] Validation before save ## Limitations diff --git a/add_migration.ps1 b/add_migration.ps1 index 6ed06739..6dbc53ac 100644 --- a/add_migration.ps1 +++ b/add_migration.ps1 @@ -1,5 +1,6 @@ param ( - [string]$name + [string]$name, + [switch]$clear ) $ErrorActionPreference = "Stop" @@ -19,54 +20,24 @@ $workingDir = $(Get-Location).Path # script Set-Location $workingDir Set-Location .\EFCore.Extensions.SaveOptimizer -dotnet build - -# SqlServer -Set-Location $workingDir -Set-Location .\EFCore.Extensions.SaveOptimizer\EFCore.Extensions.SaveOptimizer.Model.SqlServer -dotnet ef migrations add $name --no-build - -# Oracle -Set-Location $workingDir -Set-Location .\EFCore.Extensions.SaveOptimizer\EFCore.Extensions.SaveOptimizer.Model.Oracle -dotnet ef migrations add $name --no-build -# Sqlite -Set-Location $workingDir -Set-Location .\EFCore.Extensions.SaveOptimizer\EFCore.Extensions.SaveOptimizer.Model.Sqlite -dotnet ef migrations add $name --no-build - -# Postgres -Set-Location $workingDir -Set-Location .\EFCore.Extensions.SaveOptimizer\EFCore.Extensions.SaveOptimizer.Model.Postgres -dotnet ef migrations add $name --no-build - -# PomeloMySql -Set-Location $workingDir -Set-Location .\EFCore.Extensions.SaveOptimizer\EFCore.Extensions.SaveOptimizer.Model.PomeloMySql -dotnet ef migrations add $name --no-build +if ($clear) { + Get-ChildItem "Migrations" -Directory -Recurse | Foreach-Object -ThrottleLimit 10 -Parallel { + $item = $_ -# Firebird3 -Set-Location $workingDir -Set-Location .\EFCore.Extensions.SaveOptimizer\EFCore.Extensions.SaveOptimizer.Model.Firebird3 -dotnet ef migrations add $name --no-build - -# Firebird4 -Set-Location $workingDir -Set-Location .\EFCore.Extensions.SaveOptimizer\EFCore.Extensions.SaveOptimizer.Model.Firebird4 -dotnet ef migrations add $name --no-build + $item | Remove-Item -Force -Recurse + } +} -# PomeloMariaDb -Set-Location $workingDir -Set-Location .\EFCore.Extensions.SaveOptimizer\EFCore.Extensions.SaveOptimizer.Model.PomeloMariaDb -dotnet ef migrations add $name --no-build +dotnet build -# Cockroach -Set-Location $workingDir -Set-Location .\EFCore.Extensions.SaveOptimizer\EFCore.Extensions.SaveOptimizer.Model.Cockroach -dotnet ef migrations add $name --no-build +$migrations = @('.\EFCore.Extensions.SaveOptimizer\EFCore.Extensions.SaveOptimizer.Model.SqlServer', '.\EFCore.Extensions.SaveOptimizer\EFCore.Extensions.SaveOptimizer.Model.Oracle', '.\EFCore.Extensions.SaveOptimizer\EFCore.Extensions.SaveOptimizer.Model.Sqlite', '.\EFCore.Extensions.SaveOptimizer\EFCore.Extensions.SaveOptimizer.Model.Postgres', '.\EFCore.Extensions.SaveOptimizer\EFCore.Extensions.SaveOptimizer.Model.PomeloMySql', '.\EFCore.Extensions.SaveOptimizer\EFCore.Extensions.SaveOptimizer.Model.Firebird3', '.\EFCore.Extensions.SaveOptimizer\EFCore.Extensions.SaveOptimizer.Model.Firebird4', '.\EFCore.Extensions.SaveOptimizer\EFCore.Extensions.SaveOptimizer.Model.PomeloMariaDb', '.\EFCore.Extensions.SaveOptimizer\EFCore.Extensions.SaveOptimizer.Model.Cockroach', '.\EFCore.Extensions.SaveOptimizer\EFCore.Extensions.SaveOptimizer.Model.CockroachMulti') -# CockroachMulti -Set-Location $workingDir -Set-Location .\EFCore.Extensions.SaveOptimizer\EFCore.Extensions.SaveOptimizer.Model.CockroachMulti -dotnet ef migrations add $name --no-build +$migrations | Foreach-Object -ThrottleLimit 10 -Parallel { + $workingDir = $using:workingDir + $name = $using:name + $item = $_ + Set-Location $workingDir + Set-Location $item + dotnet ef migrations add $name --no-build +} diff --git a/recreate_containers.ps1 b/recreate_containers.ps1 index 6ca81d9b..8ce4c8cc 100644 --- a/recreate_containers.ps1 +++ b/recreate_containers.ps1 @@ -20,28 +20,31 @@ $workingDir = $(Get-Location).Path Set-Location .\EFCore.Extensions.SaveOptimizer\Containers -docker compose --file cockroach.yml up --detach +$yamls = @('cockroach.yml', 'cockroach_multi.yml', 'sqlserver.yml', 'postgres.yml', 'mysql_pomelo.yml', 'mariadb_pomelo.yml', 'firebird_3.yml', 'firebird_4.yml', 'oracle.yml') -docker compose --file cockroach_multi.yml up --detach +$ErrorActionPreference = 'SilentlyContinue' -docker compose --file sqlserver.yml up --detach +$yamls | Foreach-Object -ThrottleLimit 10 -Parallel { + $workingDir = $using:workingDir + $item = $_ + + Set-Location $workingDir + Set-Location .\EFCore.Extensions.SaveOptimizer\Containers + $cmd = "docker compose --file $($item) up --detach" -docker compose --file postgres.yml up --detach + Write-Host $cmd -docker compose --file mysql_pomelo.yml up --detach + cmd /c $cmd -docker compose --file mariadb_pomelo.yml up --detach - -docker compose --file firebird_3.yml up --detach - -docker compose --file firebird_4.yml up --detach + Write-Host "$($item) finished" +} -docker compose --file oracle.yml up --detach +$ErrorActionPreference = "Stop" -Start-Sleep -Seconds 10 +Start-Sleep -Seconds 5 docker compose --file cockroach_multi.yml exec optimizerroachmulti11 /cockroach/cockroach init --insecure -Start-Sleep -Seconds 10 +Start-Sleep -Seconds 5 Set-Location $workingDir diff --git a/remove_containers.ps1 b/remove_containers.ps1 index 8f764f74..fe20e677 100644 --- a/remove_containers.ps1 +++ b/remove_containers.ps1 @@ -16,25 +16,29 @@ $workingDir = $(Get-Location).Path Set-Location .\EFCore.Extensions.SaveOptimizer\Containers -docker compose --file cockroach.yml down +$yamls = @('cockroach.yml', 'cockroach_multi.yml', 'sqlserver.yml', 'postgres.yml', 'mysql_pomelo.yml', 'mariadb_pomelo.yml', 'firebird_3.yml', 'firebird_4.yml', 'oracle.yml') -docker compose --file cockroach_multi.yml down +$ErrorActionPreference = 'SilentlyContinue' -docker compose --file sqlserver.yml down +$yamls | Foreach-Object -ThrottleLimit 10 -Parallel { + $workingDir = $using:workingDir + $item = $_ + + Set-Location $workingDir + Set-Location .\EFCore.Extensions.SaveOptimizer\Containers + $cmd = "docker compose --file $($item) down" -docker compose --file postgres.yml down + Write-Host $cmd -docker compose --file mysql_pomelo.yml down + cmd /c $cmd -docker compose --file mariadb_pomelo.yml down - -docker compose --file firebird_3.yml down - -docker compose --file firebird_4.yml down + Write-Host "$($item) finished" +} -docker compose --file oracle.yml down +$ErrorActionPreference = "Stop" docker volume prune --force + Start-Sleep -Seconds 5 Set-Location $workingDir