From b2f50fe30accef1d539e1d1781b018bca44db18f Mon Sep 17 00:00:00 2001 From: Oleg Zhuk Date: Mon, 9 Jan 2023 21:25:05 +0200 Subject: [PATCH] feat: DB Agnostic architecture with SqlServer, MySql and PostgreSQL (#120) feat: DB Agnostic architecture with SqlServer, MySql and PostgreSQL --- VirtoCommerce.InventoryModule.sln | 21 ++ .../DbContextOptionsBuilderExtensions.cs | 14 ++ .../20221221132732_Initial.Designer.cs | 209 +++++++++++++++++ .../Migrations/20221221132732_Initial.cs | 129 +++++++++++ .../InventoryDbContextModelSnapshot.cs | 207 +++++++++++++++++ .../MySqlDbContextFactory.cs | 37 +++ .../Readme.md | 24 ++ ...Commerce.InventoryModule.Data.MySql.csproj | 21 ++ .../DbContextOptionsBuilderExtensions.cs | 14 ++ .../20221221132717_Initial.Designer.cs | 212 ++++++++++++++++++ .../Migrations/20221221132717_Initial.cs | 98 ++++++++ .../InventoryDbContextModelSnapshot.cs | 210 +++++++++++++++++ .../PostgreSqlDbContextFactory.cs | 21 ++ .../Readme.md | 24 ++ ...rce.InventoryModule.Data.PostgreSql.csproj | 22 ++ .../DbContextOptionsBuilderExtensions.cs | 16 ++ ...000000000000_UpdateInventoryV2.Designer.cs | 2 +- .../20000000000000_UpdateInventoryV2.cs | 2 +- ...0190409095614_InitialInventory.Designer.cs | 4 +- .../20190409095614_InitialInventory.cs | 3 +- ...0613192554_AddInventoryOuterId.Designer.cs | 4 +- .../20190613192554_AddInventoryOuterId.cs | 4 +- ...dInventorySkuModifiedDateIndex.Designer.cs | 4 +- ...052718_AddInventorySkuModifiedDateIndex.cs | 2 +- ...7121525_addFFCShortDescription.Designer.cs | 4 +- .../20220627121525_addFFCShortDescription.cs | 4 +- ...221026090608_AddOrganizationId.Designer.cs | 4 +- .../20221026090608_AddOrganizationId.cs | 4 +- .../InventoryDbContextModelSnapshot.cs | 4 +- .../Readme.md | 25 +++ .../SqlServerDbContextFactory.cs | 21 ++ ...erce.InventoryModule.Data.SqlServer.csproj | 21 ++ .../DesignTimeDbContextFactory.cs | 17 -- .../Repositories/InventoryDbContext.cs | 17 ++ .../VirtoCommerce.InventoryModule.Data.csproj | 10 - .../Module.cs | 31 ++- .../VirtoCommerce.InventoryModule.Web.csproj | 3 + .../module.manifest | 6 +- ...VirtoCommerce.InventoryModule.Tests.csproj | 2 +- 39 files changed, 1418 insertions(+), 59 deletions(-) create mode 100644 src/VirtoCommerce.InventoryModule.Data.MySql/DbContextOptionsBuilderExtensions.cs create mode 100644 src/VirtoCommerce.InventoryModule.Data.MySql/Migrations/20221221132732_Initial.Designer.cs create mode 100644 src/VirtoCommerce.InventoryModule.Data.MySql/Migrations/20221221132732_Initial.cs create mode 100644 src/VirtoCommerce.InventoryModule.Data.MySql/Migrations/InventoryDbContextModelSnapshot.cs create mode 100644 src/VirtoCommerce.InventoryModule.Data.MySql/MySqlDbContextFactory.cs create mode 100644 src/VirtoCommerce.InventoryModule.Data.MySql/Readme.md create mode 100644 src/VirtoCommerce.InventoryModule.Data.MySql/VirtoCommerce.InventoryModule.Data.MySql.csproj create mode 100644 src/VirtoCommerce.InventoryModule.Data.PostgreSql/DbContextOptionsBuilderExtensions.cs create mode 100644 src/VirtoCommerce.InventoryModule.Data.PostgreSql/Migrations/20221221132717_Initial.Designer.cs create mode 100644 src/VirtoCommerce.InventoryModule.Data.PostgreSql/Migrations/20221221132717_Initial.cs create mode 100644 src/VirtoCommerce.InventoryModule.Data.PostgreSql/Migrations/InventoryDbContextModelSnapshot.cs create mode 100644 src/VirtoCommerce.InventoryModule.Data.PostgreSql/PostgreSqlDbContextFactory.cs create mode 100644 src/VirtoCommerce.InventoryModule.Data.PostgreSql/Readme.md create mode 100644 src/VirtoCommerce.InventoryModule.Data.PostgreSql/VirtoCommerce.InventoryModule.Data.PostgreSql.csproj create mode 100644 src/VirtoCommerce.InventoryModule.Data.SqlServer/DbContextOptionsBuilderExtensions.cs rename src/{VirtoCommerce.InventoryModule.Data => VirtoCommerce.InventoryModule.Data.SqlServer}/Migrations/20000000000000_UpdateInventoryV2.Designer.cs (98%) rename src/{VirtoCommerce.InventoryModule.Data => VirtoCommerce.InventoryModule.Data.SqlServer}/Migrations/20000000000000_UpdateInventoryV2.cs (92%) rename src/{VirtoCommerce.InventoryModule.Data => VirtoCommerce.InventoryModule.Data.SqlServer}/Migrations/20190409095614_InitialInventory.Designer.cs (98%) rename src/{VirtoCommerce.InventoryModule.Data => VirtoCommerce.InventoryModule.Data.SqlServer}/Migrations/20190409095614_InitialInventory.cs (98%) rename src/{VirtoCommerce.InventoryModule.Data => VirtoCommerce.InventoryModule.Data.SqlServer}/Migrations/20190613192554_AddInventoryOuterId.Designer.cs (98%) rename src/{VirtoCommerce.InventoryModule.Data => VirtoCommerce.InventoryModule.Data.SqlServer}/Migrations/20190613192554_AddInventoryOuterId.cs (88%) rename src/{VirtoCommerce.InventoryModule.Data => VirtoCommerce.InventoryModule.Data.SqlServer}/Migrations/20210203052718_AddInventorySkuModifiedDateIndex.Designer.cs (98%) rename src/{VirtoCommerce.InventoryModule.Data => VirtoCommerce.InventoryModule.Data.SqlServer}/Migrations/20210203052718_AddInventorySkuModifiedDateIndex.cs (93%) rename src/{VirtoCommerce.InventoryModule.Data => VirtoCommerce.InventoryModule.Data.SqlServer}/Migrations/20220627121525_addFFCShortDescription.Designer.cs (98%) rename src/{VirtoCommerce.InventoryModule.Data => VirtoCommerce.InventoryModule.Data.SqlServer}/Migrations/20220627121525_addFFCShortDescription.cs (84%) rename src/{VirtoCommerce.InventoryModule.Data => VirtoCommerce.InventoryModule.Data.SqlServer}/Migrations/20221026090608_AddOrganizationId.Designer.cs (98%) rename src/{VirtoCommerce.InventoryModule.Data => VirtoCommerce.InventoryModule.Data.SqlServer}/Migrations/20221026090608_AddOrganizationId.cs (84%) rename src/{VirtoCommerce.InventoryModule.Data => VirtoCommerce.InventoryModule.Data.SqlServer}/Migrations/InventoryDbContextModelSnapshot.cs (98%) create mode 100644 src/VirtoCommerce.InventoryModule.Data.SqlServer/Readme.md create mode 100644 src/VirtoCommerce.InventoryModule.Data.SqlServer/SqlServerDbContextFactory.cs create mode 100644 src/VirtoCommerce.InventoryModule.Data.SqlServer/VirtoCommerce.InventoryModule.Data.SqlServer.csproj delete mode 100644 src/VirtoCommerce.InventoryModule.Data/Repositories/DesignTimeDbContextFactory.cs diff --git a/VirtoCommerce.InventoryModule.sln b/VirtoCommerce.InventoryModule.sln index 379c5ede..187ca5a1 100644 --- a/VirtoCommerce.InventoryModule.sln +++ b/VirtoCommerce.InventoryModule.sln @@ -15,6 +15,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{BD6EF1DA EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VirtoCommerce.InventoryModule.Tests", "tests\VirtoCommerce.InventoryModule.Tests\VirtoCommerce.InventoryModule.Tests.csproj", "{CE6513A9-CA03-494E-8998-EADCC27408FB}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VirtoCommerce.InventoryModule.Data.SqlServer", "src\VirtoCommerce.InventoryModule.Data.SqlServer\VirtoCommerce.InventoryModule.Data.SqlServer.csproj", "{92DF0B1C-4432-4EDA-8957-AAE118FB95DB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VirtoCommerce.InventoryModule.Data.PostgreSql", "src\VirtoCommerce.InventoryModule.Data.PostgreSql\VirtoCommerce.InventoryModule.Data.PostgreSql.csproj", "{776ACABF-B9BA-4CB9-8E03-32AF7EC33064}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VirtoCommerce.InventoryModule.Data.MySql", "src\VirtoCommerce.InventoryModule.Data.MySql\VirtoCommerce.InventoryModule.Data.MySql.csproj", "{091E2801-D524-4D87-9E8F-D4F4FA57A86F}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -37,6 +43,18 @@ Global {CE6513A9-CA03-494E-8998-EADCC27408FB}.Debug|Any CPU.Build.0 = Debug|Any CPU {CE6513A9-CA03-494E-8998-EADCC27408FB}.Release|Any CPU.ActiveCfg = Release|Any CPU {CE6513A9-CA03-494E-8998-EADCC27408FB}.Release|Any CPU.Build.0 = Release|Any CPU + {92DF0B1C-4432-4EDA-8957-AAE118FB95DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {92DF0B1C-4432-4EDA-8957-AAE118FB95DB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {92DF0B1C-4432-4EDA-8957-AAE118FB95DB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {92DF0B1C-4432-4EDA-8957-AAE118FB95DB}.Release|Any CPU.Build.0 = Release|Any CPU + {776ACABF-B9BA-4CB9-8E03-32AF7EC33064}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {776ACABF-B9BA-4CB9-8E03-32AF7EC33064}.Debug|Any CPU.Build.0 = Debug|Any CPU + {776ACABF-B9BA-4CB9-8E03-32AF7EC33064}.Release|Any CPU.ActiveCfg = Release|Any CPU + {776ACABF-B9BA-4CB9-8E03-32AF7EC33064}.Release|Any CPU.Build.0 = Release|Any CPU + {091E2801-D524-4D87-9E8F-D4F4FA57A86F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {091E2801-D524-4D87-9E8F-D4F4FA57A86F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {091E2801-D524-4D87-9E8F-D4F4FA57A86F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {091E2801-D524-4D87-9E8F-D4F4FA57A86F}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -46,6 +64,9 @@ Global {9C6ED9D2-7B68-45BE-8F2D-B24335F31A52} = {21D7AD7F-5786-46A4-AF0F-BF7C17AC7CCD} {9F1C3399-B061-4A86-AA21-7B468298193B} = {21D7AD7F-5786-46A4-AF0F-BF7C17AC7CCD} {CE6513A9-CA03-494E-8998-EADCC27408FB} = {BD6EF1DA-D884-4258-8EFF-1FB8770D908B} + {92DF0B1C-4432-4EDA-8957-AAE118FB95DB} = {21D7AD7F-5786-46A4-AF0F-BF7C17AC7CCD} + {776ACABF-B9BA-4CB9-8E03-32AF7EC33064} = {21D7AD7F-5786-46A4-AF0F-BF7C17AC7CCD} + {091E2801-D524-4D87-9E8F-D4F4FA57A86F} = {21D7AD7F-5786-46A4-AF0F-BF7C17AC7CCD} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {039A0599-1FC7-44B8-A9C3-54535F8B9659} diff --git a/src/VirtoCommerce.InventoryModule.Data.MySql/DbContextOptionsBuilderExtensions.cs b/src/VirtoCommerce.InventoryModule.Data.MySql/DbContextOptionsBuilderExtensions.cs new file mode 100644 index 00000000..8a64d639 --- /dev/null +++ b/src/VirtoCommerce.InventoryModule.Data.MySql/DbContextOptionsBuilderExtensions.cs @@ -0,0 +1,14 @@ +using Microsoft.EntityFrameworkCore; + +namespace VirtoCommerce.InventoryModule.Data.MySql +{ + public static class DbContextOptionsBuilderExtensions + { + /// + /// Configures the context to use PostgreSql. + /// + public static DbContextOptionsBuilder UseMySqlDatabase(this DbContextOptionsBuilder builder, string connectionString) => + builder.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString), db => db + .MigrationsAssembly(typeof(MySqlDbContextFactory).Assembly.GetName().Name)); + } +} diff --git a/src/VirtoCommerce.InventoryModule.Data.MySql/Migrations/20221221132732_Initial.Designer.cs b/src/VirtoCommerce.InventoryModule.Data.MySql/Migrations/20221221132732_Initial.Designer.cs new file mode 100644 index 00000000..5a5ad75b --- /dev/null +++ b/src/VirtoCommerce.InventoryModule.Data.MySql/Migrations/20221221132732_Initial.Designer.cs @@ -0,0 +1,209 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using VirtoCommerce.InventoryModule.Data.Repositories; + +#nullable disable + +namespace VirtoCommerce.InventoryModule.Data.MySql.Migrations +{ + [DbContext(typeof(InventoryDbContext))] + [Migration("20221221132732_Initial")] + partial class Initial + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "6.0.0") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + modelBuilder.Entity("VirtoCommerce.InventoryModule.Data.Model.FulfillmentCenterEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("City") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("CountryCode") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("CountryName") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("CreatedDate") + .HasColumnType("datetime(6)"); + + b.Property("DaytimePhoneNumber") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("GeoLocation") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("Line1") + .HasMaxLength(1024) + .HasColumnType("varchar(1024)"); + + b.Property("Line2") + .HasMaxLength(1024) + .HasColumnType("varchar(1024)"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("ModifiedDate") + .HasColumnType("datetime(6)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("OrganizationId") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("OuterId") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("PostalCode") + .HasMaxLength(32) + .HasColumnType("varchar(32)"); + + b.Property("RegionId") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("RegionName") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("ShortDescription") + .HasColumnType("longtext"); + + b.Property("StateProvince") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.HasKey("Id"); + + b.ToTable("FulfillmentCenter", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.InventoryModule.Data.Model.InventoryEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("AllowBackorder") + .HasColumnType("tinyint(1)"); + + b.Property("AllowPreorder") + .HasColumnType("tinyint(1)"); + + b.Property("BackorderAvailabilityDate") + .HasColumnType("datetime(6)"); + + b.Property("BackorderQuantity") + .HasPrecision(18, 2) + .HasColumnType("decimal(18,2)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("CreatedDate") + .HasColumnType("datetime(6)"); + + b.Property("FulfillmentCenterId") + .IsRequired() + .HasColumnType("varchar(128)"); + + b.Property("InStockQuantity") + .HasPrecision(18, 2) + .HasColumnType("decimal(18,2)"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("ModifiedDate") + .HasColumnType("datetime(6)"); + + b.Property("OuterId") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("PreorderAvailabilityDate") + .HasColumnType("datetime(6)"); + + b.Property("PreorderQuantity") + .HasPrecision(18, 2) + .HasColumnType("decimal(18,2)"); + + b.Property("ReorderMinQuantity") + .HasPrecision(18, 2) + .HasColumnType("decimal(18,2)"); + + b.Property("ReservedQuantity") + .HasPrecision(18, 2) + .HasColumnType("decimal(18,2)"); + + b.Property("Sku") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("Status") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("FulfillmentCenterId"); + + b.HasIndex("Sku", "ModifiedDate") + .HasDatabaseName("IX_Inventory_Sku_ModifiedDate"); + + b.ToTable("Inventory", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.InventoryModule.Data.Model.InventoryEntity", b => + { + b.HasOne("VirtoCommerce.InventoryModule.Data.Model.FulfillmentCenterEntity", "FulfillmentCenter") + .WithMany() + .HasForeignKey("FulfillmentCenterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("FulfillmentCenter"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/VirtoCommerce.InventoryModule.Data.MySql/Migrations/20221221132732_Initial.cs b/src/VirtoCommerce.InventoryModule.Data.MySql/Migrations/20221221132732_Initial.cs new file mode 100644 index 00000000..7852ec4e --- /dev/null +++ b/src/VirtoCommerce.InventoryModule.Data.MySql/Migrations/20221221132732_Initial.cs @@ -0,0 +1,129 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace VirtoCommerce.InventoryModule.Data.MySql.Migrations +{ + public partial class Initial : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterDatabase() + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "FulfillmentCenter", + columns: table => new + { + Id = table.Column(type: "varchar(128)", maxLength: 128, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + Name = table.Column(type: "varchar(128)", maxLength: 128, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + Description = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + ShortDescription = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + Line1 = table.Column(type: "varchar(1024)", maxLength: 1024, nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + Line2 = table.Column(type: "varchar(1024)", maxLength: 1024, nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + City = table.Column(type: "varchar(128)", maxLength: 128, nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + CountryCode = table.Column(type: "varchar(64)", maxLength: 64, nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + StateProvince = table.Column(type: "varchar(128)", maxLength: 128, nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + CountryName = table.Column(type: "varchar(128)", maxLength: 128, nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + PostalCode = table.Column(type: "varchar(32)", maxLength: 32, nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + RegionId = table.Column(type: "varchar(128)", maxLength: 128, nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + RegionName = table.Column(type: "varchar(128)", maxLength: 128, nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + DaytimePhoneNumber = table.Column(type: "varchar(64)", maxLength: 64, nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + Email = table.Column(type: "varchar(256)", maxLength: 256, nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + OrganizationId = table.Column(type: "varchar(128)", maxLength: 128, nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + GeoLocation = table.Column(type: "varchar(64)", maxLength: 64, nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + OuterId = table.Column(type: "varchar(128)", maxLength: 128, nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + CreatedDate = table.Column(type: "datetime(6)", nullable: false), + ModifiedDate = table.Column(type: "datetime(6)", nullable: true), + CreatedBy = table.Column(type: "varchar(64)", maxLength: 64, nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + ModifiedBy = table.Column(type: "varchar(64)", maxLength: 64, nullable: true) + .Annotation("MySql:CharSet", "utf8mb4") + }, + constraints: table => + { + table.PrimaryKey("PK_FulfillmentCenter", x => x.Id); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "Inventory", + columns: table => new + { + Id = table.Column(type: "varchar(128)", maxLength: 128, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + InStockQuantity = table.Column(type: "decimal(18,2)", precision: 18, scale: 2, nullable: false), + ReservedQuantity = table.Column(type: "decimal(18,2)", precision: 18, scale: 2, nullable: false), + ReorderMinQuantity = table.Column(type: "decimal(18,2)", precision: 18, scale: 2, nullable: false), + PreorderQuantity = table.Column(type: "decimal(18,2)", precision: 18, scale: 2, nullable: false), + BackorderQuantity = table.Column(type: "decimal(18,2)", precision: 18, scale: 2, nullable: false), + AllowBackorder = table.Column(type: "tinyint(1)", nullable: false), + AllowPreorder = table.Column(type: "tinyint(1)", nullable: false), + Status = table.Column(type: "int", nullable: false), + PreorderAvailabilityDate = table.Column(type: "datetime(6)", nullable: true), + BackorderAvailabilityDate = table.Column(type: "datetime(6)", nullable: true), + Sku = table.Column(type: "varchar(128)", maxLength: 128, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + OuterId = table.Column(type: "varchar(128)", maxLength: 128, nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + FulfillmentCenterId = table.Column(type: "varchar(128)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + CreatedDate = table.Column(type: "datetime(6)", nullable: false), + ModifiedDate = table.Column(type: "datetime(6)", nullable: true), + CreatedBy = table.Column(type: "varchar(64)", maxLength: 64, nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + ModifiedBy = table.Column(type: "varchar(64)", maxLength: 64, nullable: true) + .Annotation("MySql:CharSet", "utf8mb4") + }, + constraints: table => + { + table.PrimaryKey("PK_Inventory", x => x.Id); + table.ForeignKey( + name: "FK_Inventory_FulfillmentCenter_FulfillmentCenterId", + column: x => x.FulfillmentCenterId, + principalTable: "FulfillmentCenter", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateIndex( + name: "IX_Inventory_FulfillmentCenterId", + table: "Inventory", + column: "FulfillmentCenterId"); + + migrationBuilder.CreateIndex( + name: "IX_Inventory_Sku_ModifiedDate", + table: "Inventory", + columns: new[] { "Sku", "ModifiedDate" }); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Inventory"); + + migrationBuilder.DropTable( + name: "FulfillmentCenter"); + } + } +} diff --git a/src/VirtoCommerce.InventoryModule.Data.MySql/Migrations/InventoryDbContextModelSnapshot.cs b/src/VirtoCommerce.InventoryModule.Data.MySql/Migrations/InventoryDbContextModelSnapshot.cs new file mode 100644 index 00000000..544d67ad --- /dev/null +++ b/src/VirtoCommerce.InventoryModule.Data.MySql/Migrations/InventoryDbContextModelSnapshot.cs @@ -0,0 +1,207 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using VirtoCommerce.InventoryModule.Data.Repositories; + +#nullable disable + +namespace VirtoCommerce.InventoryModule.Data.MySql.Migrations +{ + [DbContext(typeof(InventoryDbContext))] + partial class InventoryDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "6.0.0") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + modelBuilder.Entity("VirtoCommerce.InventoryModule.Data.Model.FulfillmentCenterEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("City") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("CountryCode") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("CountryName") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("CreatedDate") + .HasColumnType("datetime(6)"); + + b.Property("DaytimePhoneNumber") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("GeoLocation") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("Line1") + .HasMaxLength(1024) + .HasColumnType("varchar(1024)"); + + b.Property("Line2") + .HasMaxLength(1024) + .HasColumnType("varchar(1024)"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("ModifiedDate") + .HasColumnType("datetime(6)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("OrganizationId") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("OuterId") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("PostalCode") + .HasMaxLength(32) + .HasColumnType("varchar(32)"); + + b.Property("RegionId") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("RegionName") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("ShortDescription") + .HasColumnType("longtext"); + + b.Property("StateProvince") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.HasKey("Id"); + + b.ToTable("FulfillmentCenter", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.InventoryModule.Data.Model.InventoryEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("AllowBackorder") + .HasColumnType("tinyint(1)"); + + b.Property("AllowPreorder") + .HasColumnType("tinyint(1)"); + + b.Property("BackorderAvailabilityDate") + .HasColumnType("datetime(6)"); + + b.Property("BackorderQuantity") + .HasPrecision(18, 2) + .HasColumnType("decimal(18,2)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("CreatedDate") + .HasColumnType("datetime(6)"); + + b.Property("FulfillmentCenterId") + .IsRequired() + .HasColumnType("varchar(128)"); + + b.Property("InStockQuantity") + .HasPrecision(18, 2) + .HasColumnType("decimal(18,2)"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("ModifiedDate") + .HasColumnType("datetime(6)"); + + b.Property("OuterId") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("PreorderAvailabilityDate") + .HasColumnType("datetime(6)"); + + b.Property("PreorderQuantity") + .HasPrecision(18, 2) + .HasColumnType("decimal(18,2)"); + + b.Property("ReorderMinQuantity") + .HasPrecision(18, 2) + .HasColumnType("decimal(18,2)"); + + b.Property("ReservedQuantity") + .HasPrecision(18, 2) + .HasColumnType("decimal(18,2)"); + + b.Property("Sku") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("Status") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("FulfillmentCenterId"); + + b.HasIndex("Sku", "ModifiedDate") + .HasDatabaseName("IX_Inventory_Sku_ModifiedDate"); + + b.ToTable("Inventory", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.InventoryModule.Data.Model.InventoryEntity", b => + { + b.HasOne("VirtoCommerce.InventoryModule.Data.Model.FulfillmentCenterEntity", "FulfillmentCenter") + .WithMany() + .HasForeignKey("FulfillmentCenterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("FulfillmentCenter"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/VirtoCommerce.InventoryModule.Data.MySql/MySqlDbContextFactory.cs b/src/VirtoCommerce.InventoryModule.Data.MySql/MySqlDbContextFactory.cs new file mode 100644 index 00000000..84c581d7 --- /dev/null +++ b/src/VirtoCommerce.InventoryModule.Data.MySql/MySqlDbContextFactory.cs @@ -0,0 +1,37 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Design; +using VirtoCommerce.InventoryModule.Data.Repositories; + +namespace VirtoCommerce.InventoryModule.Data.MySql +{ + public class MySqlDbContextFactory : IDesignTimeDbContextFactory + { + public InventoryDbContext CreateDbContext(string[] args) + { + var builder = new DbContextOptionsBuilder(); + var connectionString = args.Any() ? args[0] : "server=localhost;user=root;password=virto;database=VirtoCommerce3;"; + var serverVersion = args.Length >= 2 ? args[1] : null; + + builder.UseMySql( + connectionString, + ResolveServerVersion(serverVersion, connectionString), + db => db + .MigrationsAssembly(typeof(MySqlDbContextFactory).Assembly.GetName().Name)); + + return new InventoryDbContext(builder.Options); + } + + private static ServerVersion ResolveServerVersion(string? serverVersion, string connectionString) + { + if (serverVersion == "AutoDetect") + { + return ServerVersion.AutoDetect(connectionString); + } + else if (serverVersion != null) + { + return ServerVersion.Parse(serverVersion); + } + return new MySqlServerVersion(new Version(5, 7)); + } + } +} diff --git a/src/VirtoCommerce.InventoryModule.Data.MySql/Readme.md b/src/VirtoCommerce.InventoryModule.Data.MySql/Readme.md new file mode 100644 index 00000000..6cae08a2 --- /dev/null +++ b/src/VirtoCommerce.InventoryModule.Data.MySql/Readme.md @@ -0,0 +1,24 @@ + +## Package manager +Add-Migration Initial -Context VirtoCommerce.InventoryModule.Data.Repositories.InventoryDbContext -Verbose -OutputDir Migrations -Project VirtoCommerce.InventoryModule.Data.MySql -StartupProject VirtoCommerce.InventoryModule.Data.MySql -Debug + + + +### Entity Framework Core Commands +``` +dotnet tool install --global dotnet-ef --version 6.* +``` + +**Generate Migrations** + +``` +dotnet ef migrations add Initial -- "{connection string}" +dotnet ef migrations add Update1 -- "{connection string}" +dotnet ef migrations add Update2 -- "{connection string}" +``` + +etc.. + +**Apply Migrations** + +`dotnet ef database update -- "{connection string}"` diff --git a/src/VirtoCommerce.InventoryModule.Data.MySql/VirtoCommerce.InventoryModule.Data.MySql.csproj b/src/VirtoCommerce.InventoryModule.Data.MySql/VirtoCommerce.InventoryModule.Data.MySql.csproj new file mode 100644 index 00000000..0dc71501 --- /dev/null +++ b/src/VirtoCommerce.InventoryModule.Data.MySql/VirtoCommerce.InventoryModule.Data.MySql.csproj @@ -0,0 +1,21 @@ + + + + net6.0 + enable + enable + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + diff --git a/src/VirtoCommerce.InventoryModule.Data.PostgreSql/DbContextOptionsBuilderExtensions.cs b/src/VirtoCommerce.InventoryModule.Data.PostgreSql/DbContextOptionsBuilderExtensions.cs new file mode 100644 index 00000000..e795b336 --- /dev/null +++ b/src/VirtoCommerce.InventoryModule.Data.PostgreSql/DbContextOptionsBuilderExtensions.cs @@ -0,0 +1,14 @@ +using Microsoft.EntityFrameworkCore; + +namespace VirtoCommerce.InventoryModule.Data.PostgreSql +{ + public static class DbContextOptionsBuilderExtensions + { + /// + /// Configures the context to use PostgreSql. + /// + public static DbContextOptionsBuilder UsePostgreSqlDatabase(this DbContextOptionsBuilder builder, string connectionString) => + builder.UseNpgsql(connectionString, db => db + .MigrationsAssembly(typeof(PostgreSqlDbContextFactory).Assembly.GetName().Name)); + } +} diff --git a/src/VirtoCommerce.InventoryModule.Data.PostgreSql/Migrations/20221221132717_Initial.Designer.cs b/src/VirtoCommerce.InventoryModule.Data.PostgreSql/Migrations/20221221132717_Initial.Designer.cs new file mode 100644 index 00000000..8a2f6353 --- /dev/null +++ b/src/VirtoCommerce.InventoryModule.Data.PostgreSql/Migrations/20221221132717_Initial.Designer.cs @@ -0,0 +1,212 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using VirtoCommerce.InventoryModule.Data.Repositories; + +#nullable disable + +namespace VirtoCommerce.InventoryModule.Data.PostgreSql.Migrations +{ + [DbContext(typeof(InventoryDbContext))] + [Migration("20221221132717_Initial")] + partial class Initial + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "6.0.0") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("VirtoCommerce.InventoryModule.Data.Model.FulfillmentCenterEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("City") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("CountryCode") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("CountryName") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("DaytimePhoneNumber") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("GeoLocation") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Line1") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("Line2") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ModifiedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("OrganizationId") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("OuterId") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("PostalCode") + .HasMaxLength(32) + .HasColumnType("character varying(32)"); + + b.Property("RegionId") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("RegionName") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ShortDescription") + .HasColumnType("text"); + + b.Property("StateProvince") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.HasKey("Id"); + + b.ToTable("FulfillmentCenter", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.InventoryModule.Data.Model.InventoryEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("AllowBackorder") + .HasColumnType("boolean"); + + b.Property("AllowPreorder") + .HasColumnType("boolean"); + + b.Property("BackorderAvailabilityDate") + .HasColumnType("timestamp with time zone"); + + b.Property("BackorderQuantity") + .HasPrecision(18, 2) + .HasColumnType("numeric(18,2)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("FulfillmentCenterId") + .IsRequired() + .HasColumnType("character varying(128)"); + + b.Property("InStockQuantity") + .HasPrecision(18, 2) + .HasColumnType("numeric(18,2)"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ModifiedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("OuterId") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("PreorderAvailabilityDate") + .HasColumnType("timestamp with time zone"); + + b.Property("PreorderQuantity") + .HasPrecision(18, 2) + .HasColumnType("numeric(18,2)"); + + b.Property("ReorderMinQuantity") + .HasPrecision(18, 2) + .HasColumnType("numeric(18,2)"); + + b.Property("ReservedQuantity") + .HasPrecision(18, 2) + .HasColumnType("numeric(18,2)"); + + b.Property("Sku") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Status") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("FulfillmentCenterId"); + + b.HasIndex("Sku", "ModifiedDate") + .HasDatabaseName("IX_Inventory_Sku_ModifiedDate"); + + b.ToTable("Inventory", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.InventoryModule.Data.Model.InventoryEntity", b => + { + b.HasOne("VirtoCommerce.InventoryModule.Data.Model.FulfillmentCenterEntity", "FulfillmentCenter") + .WithMany() + .HasForeignKey("FulfillmentCenterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("FulfillmentCenter"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/VirtoCommerce.InventoryModule.Data.PostgreSql/Migrations/20221221132717_Initial.cs b/src/VirtoCommerce.InventoryModule.Data.PostgreSql/Migrations/20221221132717_Initial.cs new file mode 100644 index 00000000..87e5df31 --- /dev/null +++ b/src/VirtoCommerce.InventoryModule.Data.PostgreSql/Migrations/20221221132717_Initial.cs @@ -0,0 +1,98 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace VirtoCommerce.InventoryModule.Data.PostgreSql.Migrations +{ + public partial class Initial : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "FulfillmentCenter", + columns: table => new + { + Id = table.Column(type: "character varying(128)", maxLength: 128, nullable: false), + Name = table.Column(type: "character varying(128)", maxLength: 128, nullable: false), + Description = table.Column(type: "text", nullable: true), + ShortDescription = table.Column(type: "text", nullable: true), + Line1 = table.Column(type: "character varying(1024)", maxLength: 1024, nullable: true), + Line2 = table.Column(type: "character varying(1024)", maxLength: 1024, nullable: true), + City = table.Column(type: "character varying(128)", maxLength: 128, nullable: true), + CountryCode = table.Column(type: "character varying(64)", maxLength: 64, nullable: true), + StateProvince = table.Column(type: "character varying(128)", maxLength: 128, nullable: true), + CountryName = table.Column(type: "character varying(128)", maxLength: 128, nullable: true), + PostalCode = table.Column(type: "character varying(32)", maxLength: 32, nullable: true), + RegionId = table.Column(type: "character varying(128)", maxLength: 128, nullable: true), + RegionName = table.Column(type: "character varying(128)", maxLength: 128, nullable: true), + DaytimePhoneNumber = table.Column(type: "character varying(64)", maxLength: 64, nullable: true), + Email = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), + OrganizationId = table.Column(type: "character varying(128)", maxLength: 128, nullable: true), + GeoLocation = table.Column(type: "character varying(64)", maxLength: 64, nullable: true), + OuterId = table.Column(type: "character varying(128)", maxLength: 128, nullable: true), + CreatedDate = table.Column(type: "timestamp with time zone", nullable: false), + ModifiedDate = table.Column(type: "timestamp with time zone", nullable: true), + CreatedBy = table.Column(type: "character varying(64)", maxLength: 64, nullable: true), + ModifiedBy = table.Column(type: "character varying(64)", maxLength: 64, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_FulfillmentCenter", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Inventory", + columns: table => new + { + Id = table.Column(type: "character varying(128)", maxLength: 128, nullable: false), + InStockQuantity = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false), + ReservedQuantity = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false), + ReorderMinQuantity = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false), + PreorderQuantity = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false), + BackorderQuantity = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false), + AllowBackorder = table.Column(type: "boolean", nullable: false), + AllowPreorder = table.Column(type: "boolean", nullable: false), + Status = table.Column(type: "integer", nullable: false), + PreorderAvailabilityDate = table.Column(type: "timestamp with time zone", nullable: true), + BackorderAvailabilityDate = table.Column(type: "timestamp with time zone", nullable: true), + Sku = table.Column(type: "character varying(128)", maxLength: 128, nullable: false), + OuterId = table.Column(type: "character varying(128)", maxLength: 128, nullable: true), + FulfillmentCenterId = table.Column(type: "character varying(128)", nullable: false), + CreatedDate = table.Column(type: "timestamp with time zone", nullable: false), + ModifiedDate = table.Column(type: "timestamp with time zone", nullable: true), + CreatedBy = table.Column(type: "character varying(64)", maxLength: 64, nullable: true), + ModifiedBy = table.Column(type: "character varying(64)", maxLength: 64, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Inventory", x => x.Id); + table.ForeignKey( + name: "FK_Inventory_FulfillmentCenter_FulfillmentCenterId", + column: x => x.FulfillmentCenterId, + principalTable: "FulfillmentCenter", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_Inventory_FulfillmentCenterId", + table: "Inventory", + column: "FulfillmentCenterId"); + + migrationBuilder.CreateIndex( + name: "IX_Inventory_Sku_ModifiedDate", + table: "Inventory", + columns: new[] { "Sku", "ModifiedDate" }); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Inventory"); + + migrationBuilder.DropTable( + name: "FulfillmentCenter"); + } + } +} diff --git a/src/VirtoCommerce.InventoryModule.Data.PostgreSql/Migrations/InventoryDbContextModelSnapshot.cs b/src/VirtoCommerce.InventoryModule.Data.PostgreSql/Migrations/InventoryDbContextModelSnapshot.cs new file mode 100644 index 00000000..4e488a08 --- /dev/null +++ b/src/VirtoCommerce.InventoryModule.Data.PostgreSql/Migrations/InventoryDbContextModelSnapshot.cs @@ -0,0 +1,210 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using VirtoCommerce.InventoryModule.Data.Repositories; + +#nullable disable + +namespace VirtoCommerce.InventoryModule.Data.PostgreSql.Migrations +{ + [DbContext(typeof(InventoryDbContext))] + partial class InventoryDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "6.0.0") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("VirtoCommerce.InventoryModule.Data.Model.FulfillmentCenterEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("City") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("CountryCode") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("CountryName") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("DaytimePhoneNumber") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("GeoLocation") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Line1") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("Line2") + .HasMaxLength(1024) + .HasColumnType("character varying(1024)"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ModifiedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("OrganizationId") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("OuterId") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("PostalCode") + .HasMaxLength(32) + .HasColumnType("character varying(32)"); + + b.Property("RegionId") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("RegionName") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ShortDescription") + .HasColumnType("text"); + + b.Property("StateProvince") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.HasKey("Id"); + + b.ToTable("FulfillmentCenter", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.InventoryModule.Data.Model.InventoryEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("AllowBackorder") + .HasColumnType("boolean"); + + b.Property("AllowPreorder") + .HasColumnType("boolean"); + + b.Property("BackorderAvailabilityDate") + .HasColumnType("timestamp with time zone"); + + b.Property("BackorderQuantity") + .HasPrecision(18, 2) + .HasColumnType("numeric(18,2)"); + + b.Property("CreatedBy") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("FulfillmentCenterId") + .IsRequired() + .HasColumnType("character varying(128)"); + + b.Property("InStockQuantity") + .HasPrecision(18, 2) + .HasColumnType("numeric(18,2)"); + + b.Property("ModifiedBy") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("ModifiedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("OuterId") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("PreorderAvailabilityDate") + .HasColumnType("timestamp with time zone"); + + b.Property("PreorderQuantity") + .HasPrecision(18, 2) + .HasColumnType("numeric(18,2)"); + + b.Property("ReorderMinQuantity") + .HasPrecision(18, 2) + .HasColumnType("numeric(18,2)"); + + b.Property("ReservedQuantity") + .HasPrecision(18, 2) + .HasColumnType("numeric(18,2)"); + + b.Property("Sku") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Status") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("FulfillmentCenterId"); + + b.HasIndex("Sku", "ModifiedDate") + .HasDatabaseName("IX_Inventory_Sku_ModifiedDate"); + + b.ToTable("Inventory", (string)null); + }); + + modelBuilder.Entity("VirtoCommerce.InventoryModule.Data.Model.InventoryEntity", b => + { + b.HasOne("VirtoCommerce.InventoryModule.Data.Model.FulfillmentCenterEntity", "FulfillmentCenter") + .WithMany() + .HasForeignKey("FulfillmentCenterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("FulfillmentCenter"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/VirtoCommerce.InventoryModule.Data.PostgreSql/PostgreSqlDbContextFactory.cs b/src/VirtoCommerce.InventoryModule.Data.PostgreSql/PostgreSqlDbContextFactory.cs new file mode 100644 index 00000000..d7e4348e --- /dev/null +++ b/src/VirtoCommerce.InventoryModule.Data.PostgreSql/PostgreSqlDbContextFactory.cs @@ -0,0 +1,21 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Design; +using VirtoCommerce.InventoryModule.Data.Repositories; + +namespace VirtoCommerce.InventoryModule.Data.PostgreSql +{ + public class PostgreSqlDbContextFactory : IDesignTimeDbContextFactory + { + public InventoryDbContext CreateDbContext(string[] args) + { + var builder = new DbContextOptionsBuilder(); + var connectionString = args.Any() ? args[0] : "User ID = postgres; Password = password; Host = localhost; Port = 5432; Database = virtocommerce3;"; + + builder.UseNpgsql( + connectionString, + db => db.MigrationsAssembly(typeof(PostgreSqlDbContextFactory).Assembly.GetName().Name)); + + return new InventoryDbContext(builder.Options); + } + } +} diff --git a/src/VirtoCommerce.InventoryModule.Data.PostgreSql/Readme.md b/src/VirtoCommerce.InventoryModule.Data.PostgreSql/Readme.md new file mode 100644 index 00000000..751e6777 --- /dev/null +++ b/src/VirtoCommerce.InventoryModule.Data.PostgreSql/Readme.md @@ -0,0 +1,24 @@ + +## Package manager +Add-Migration Initial -Context VirtoCommerce.InventoryModule.Data.Repositories.InventoryDbContext -Verbose -OutputDir Migrations -Project VirtoCommerce.InventoryModule.Data.PostgreSql -StartupProject VirtoCommerce.InventoryModule.Data.PostgreSql -Debug + + + +### Entity Framework Core Commands +``` +dotnet tool install --global dotnet-ef --version 6.* +``` + +**Generate Migrations** + +``` +dotnet ef migrations add Initial -- "{connection string}" +dotnet ef migrations add Update1 -- "{connection string}" +dotnet ef migrations add Update2 -- "{connection string}" +``` + +etc.. + +**Apply Migrations** + +`dotnet ef database update -- "{connection string}"` diff --git a/src/VirtoCommerce.InventoryModule.Data.PostgreSql/VirtoCommerce.InventoryModule.Data.PostgreSql.csproj b/src/VirtoCommerce.InventoryModule.Data.PostgreSql/VirtoCommerce.InventoryModule.Data.PostgreSql.csproj new file mode 100644 index 00000000..5b079d37 --- /dev/null +++ b/src/VirtoCommerce.InventoryModule.Data.PostgreSql/VirtoCommerce.InventoryModule.Data.PostgreSql.csproj @@ -0,0 +1,22 @@ + + + + net6.0 + enable + enable + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + diff --git a/src/VirtoCommerce.InventoryModule.Data.SqlServer/DbContextOptionsBuilderExtensions.cs b/src/VirtoCommerce.InventoryModule.Data.SqlServer/DbContextOptionsBuilderExtensions.cs new file mode 100644 index 00000000..d0744aca --- /dev/null +++ b/src/VirtoCommerce.InventoryModule.Data.SqlServer/DbContextOptionsBuilderExtensions.cs @@ -0,0 +1,16 @@ +using Microsoft.EntityFrameworkCore; + +namespace VirtoCommerce.InventoryModule.Data.SqlServer +{ + public static class DbContextOptionsBuilderExtensions + { + /// + /// Configures the context to use SqlServer. + /// + public static DbContextOptionsBuilder UseSqlServerDatabase(this DbContextOptionsBuilder builder, string connectionString) + { + return builder.UseSqlServer(connectionString, db => db + .MigrationsAssembly(typeof(SqlServerDbContextFactory).Assembly.GetName().Name)); + } + } +} diff --git a/src/VirtoCommerce.InventoryModule.Data/Migrations/20000000000000_UpdateInventoryV2.Designer.cs b/src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/20000000000000_UpdateInventoryV2.Designer.cs similarity index 98% rename from src/VirtoCommerce.InventoryModule.Data/Migrations/20000000000000_UpdateInventoryV2.Designer.cs rename to src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/20000000000000_UpdateInventoryV2.Designer.cs index c64e3447..5287cae8 100644 --- a/src/VirtoCommerce.InventoryModule.Data/Migrations/20000000000000_UpdateInventoryV2.Designer.cs +++ b/src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/20000000000000_UpdateInventoryV2.Designer.cs @@ -6,7 +6,7 @@ using Microsoft.EntityFrameworkCore.Migrations; using VirtoCommerce.InventoryModule.Data.Repositories; -namespace VirtoCommerce.InventoryModule.Data.Migrations +namespace VirtoCommerce.InventoryModule.Data.SqlServer.Migrations { [DbContext(typeof(InventoryDbContext))] [Migration("20000000000000_UpdateInventoryV2")] diff --git a/src/VirtoCommerce.InventoryModule.Data/Migrations/20000000000000_UpdateInventoryV2.cs b/src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/20000000000000_UpdateInventoryV2.cs similarity index 92% rename from src/VirtoCommerce.InventoryModule.Data/Migrations/20000000000000_UpdateInventoryV2.cs rename to src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/20000000000000_UpdateInventoryV2.cs index eeab803e..bf03f8b5 100644 --- a/src/VirtoCommerce.InventoryModule.Data/Migrations/20000000000000_UpdateInventoryV2.cs +++ b/src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/20000000000000_UpdateInventoryV2.cs @@ -1,6 +1,6 @@ using Microsoft.EntityFrameworkCore.Migrations; -namespace VirtoCommerce.InventoryModule.Data.Migrations +namespace VirtoCommerce.InventoryModule.Data.SqlServer.Migrations { public partial class UpdateInventoryV2 : Migration { diff --git a/src/VirtoCommerce.InventoryModule.Data/Migrations/20190409095614_InitialInventory.Designer.cs b/src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/20190409095614_InitialInventory.Designer.cs similarity index 98% rename from src/VirtoCommerce.InventoryModule.Data/Migrations/20190409095614_InitialInventory.Designer.cs rename to src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/20190409095614_InitialInventory.Designer.cs index e14a12c1..cc3912c6 100644 --- a/src/VirtoCommerce.InventoryModule.Data/Migrations/20190409095614_InitialInventory.Designer.cs +++ b/src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/20190409095614_InitialInventory.Designer.cs @@ -1,4 +1,4 @@ -// +// using System; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; @@ -7,7 +7,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using VirtoCommerce.InventoryModule.Data.Repositories; -namespace VirtoCommerce.InventoryModule.Data.Migrations +namespace VirtoCommerce.InventoryModule.Data.SqlServer.Migrations { [DbContext(typeof(InventoryDbContext))] [Migration("20190409095614_InitialInventory")] diff --git a/src/VirtoCommerce.InventoryModule.Data/Migrations/20190409095614_InitialInventory.cs b/src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/20190409095614_InitialInventory.cs similarity index 98% rename from src/VirtoCommerce.InventoryModule.Data/Migrations/20190409095614_InitialInventory.cs rename to src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/20190409095614_InitialInventory.cs index 58881e05..5d4f99df 100644 --- a/src/VirtoCommerce.InventoryModule.Data/Migrations/20190409095614_InitialInventory.cs +++ b/src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/20190409095614_InitialInventory.cs @@ -1,7 +1,6 @@ -using System; using Microsoft.EntityFrameworkCore.Migrations; -namespace VirtoCommerce.InventoryModule.Data.Migrations +namespace VirtoCommerce.InventoryModule.Data.SqlServer.Migrations { public partial class InitialInventory : Migration { diff --git a/src/VirtoCommerce.InventoryModule.Data/Migrations/20190613192554_AddInventoryOuterId.Designer.cs b/src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/20190613192554_AddInventoryOuterId.Designer.cs similarity index 98% rename from src/VirtoCommerce.InventoryModule.Data/Migrations/20190613192554_AddInventoryOuterId.Designer.cs rename to src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/20190613192554_AddInventoryOuterId.Designer.cs index 5f66c3f4..423ea4b9 100644 --- a/src/VirtoCommerce.InventoryModule.Data/Migrations/20190613192554_AddInventoryOuterId.Designer.cs +++ b/src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/20190613192554_AddInventoryOuterId.Designer.cs @@ -1,4 +1,4 @@ -// +// using System; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; @@ -7,7 +7,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using VirtoCommerce.InventoryModule.Data.Repositories; -namespace VirtoCommerce.InventoryModule.Data.Migrations +namespace VirtoCommerce.InventoryModule.Data.SqlServer.Migrations { [DbContext(typeof(InventoryDbContext))] [Migration("20190613192554_AddInventoryOuterId")] diff --git a/src/VirtoCommerce.InventoryModule.Data/Migrations/20190613192554_AddInventoryOuterId.cs b/src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/20190613192554_AddInventoryOuterId.cs similarity index 88% rename from src/VirtoCommerce.InventoryModule.Data/Migrations/20190613192554_AddInventoryOuterId.cs rename to src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/20190613192554_AddInventoryOuterId.cs index d3088f25..0c998d9d 100644 --- a/src/VirtoCommerce.InventoryModule.Data/Migrations/20190613192554_AddInventoryOuterId.cs +++ b/src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/20190613192554_AddInventoryOuterId.cs @@ -1,6 +1,6 @@ -using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Migrations; -namespace VirtoCommerce.InventoryModule.Data.Migrations +namespace VirtoCommerce.InventoryModule.Data.SqlServer.Migrations { public partial class AddInventoryOuterId : Migration { diff --git a/src/VirtoCommerce.InventoryModule.Data/Migrations/20210203052718_AddInventorySkuModifiedDateIndex.Designer.cs b/src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/20210203052718_AddInventorySkuModifiedDateIndex.Designer.cs similarity index 98% rename from src/VirtoCommerce.InventoryModule.Data/Migrations/20210203052718_AddInventorySkuModifiedDateIndex.Designer.cs rename to src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/20210203052718_AddInventorySkuModifiedDateIndex.Designer.cs index 66bc2b98..3222487c 100644 --- a/src/VirtoCommerce.InventoryModule.Data/Migrations/20210203052718_AddInventorySkuModifiedDateIndex.Designer.cs +++ b/src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/20210203052718_AddInventorySkuModifiedDateIndex.Designer.cs @@ -1,4 +1,4 @@ -// +// using System; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; @@ -7,7 +7,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using VirtoCommerce.InventoryModule.Data.Repositories; -namespace VirtoCommerce.InventoryModule.Data.Migrations +namespace VirtoCommerce.InventoryModule.Data.SqlServer.Migrations { [DbContext(typeof(InventoryDbContext))] [Migration("20210203052718_AddInventorySkuModifiedDateIndex")] diff --git a/src/VirtoCommerce.InventoryModule.Data/Migrations/20210203052718_AddInventorySkuModifiedDateIndex.cs b/src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/20210203052718_AddInventorySkuModifiedDateIndex.cs similarity index 93% rename from src/VirtoCommerce.InventoryModule.Data/Migrations/20210203052718_AddInventorySkuModifiedDateIndex.cs rename to src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/20210203052718_AddInventorySkuModifiedDateIndex.cs index 38393a5c..97e3ebf3 100644 --- a/src/VirtoCommerce.InventoryModule.Data/Migrations/20210203052718_AddInventorySkuModifiedDateIndex.cs +++ b/src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/20210203052718_AddInventorySkuModifiedDateIndex.cs @@ -1,6 +1,6 @@ using Microsoft.EntityFrameworkCore.Migrations; -namespace VirtoCommerce.InventoryModule.Data.Migrations +namespace VirtoCommerce.InventoryModule.Data.SqlServer.Migrations { public partial class AddInventorySkuModifiedDateIndex : Migration { diff --git a/src/VirtoCommerce.InventoryModule.Data/Migrations/20220627121525_addFFCShortDescription.Designer.cs b/src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/20220627121525_addFFCShortDescription.Designer.cs similarity index 98% rename from src/VirtoCommerce.InventoryModule.Data/Migrations/20220627121525_addFFCShortDescription.Designer.cs rename to src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/20220627121525_addFFCShortDescription.Designer.cs index c0f3df86..e2f8ec1a 100644 --- a/src/VirtoCommerce.InventoryModule.Data/Migrations/20220627121525_addFFCShortDescription.Designer.cs +++ b/src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/20220627121525_addFFCShortDescription.Designer.cs @@ -1,4 +1,4 @@ -// +// using System; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; @@ -9,7 +9,7 @@ #nullable disable -namespace VirtoCommerce.InventoryModule.Data.Migrations +namespace VirtoCommerce.InventoryModule.Data.SqlServer.Migrations { [DbContext(typeof(InventoryDbContext))] [Migration("20220627121525_addFFCShortDescription")] diff --git a/src/VirtoCommerce.InventoryModule.Data/Migrations/20220627121525_addFFCShortDescription.cs b/src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/20220627121525_addFFCShortDescription.cs similarity index 84% rename from src/VirtoCommerce.InventoryModule.Data/Migrations/20220627121525_addFFCShortDescription.cs rename to src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/20220627121525_addFFCShortDescription.cs index 665ed2c2..a7b54338 100644 --- a/src/VirtoCommerce.InventoryModule.Data/Migrations/20220627121525_addFFCShortDescription.cs +++ b/src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/20220627121525_addFFCShortDescription.cs @@ -1,8 +1,8 @@ -using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Migrations; #nullable disable -namespace VirtoCommerce.InventoryModule.Data.Migrations +namespace VirtoCommerce.InventoryModule.Data.SqlServer.Migrations { public partial class addFFCShortDescription : Migration { diff --git a/src/VirtoCommerce.InventoryModule.Data/Migrations/20221026090608_AddOrganizationId.Designer.cs b/src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/20221026090608_AddOrganizationId.Designer.cs similarity index 98% rename from src/VirtoCommerce.InventoryModule.Data/Migrations/20221026090608_AddOrganizationId.Designer.cs rename to src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/20221026090608_AddOrganizationId.Designer.cs index a18807b1..0aed8daa 100644 --- a/src/VirtoCommerce.InventoryModule.Data/Migrations/20221026090608_AddOrganizationId.Designer.cs +++ b/src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/20221026090608_AddOrganizationId.Designer.cs @@ -1,4 +1,4 @@ -// +// using System; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; @@ -9,7 +9,7 @@ #nullable disable -namespace VirtoCommerce.InventoryModule.Data.Migrations +namespace VirtoCommerce.InventoryModule.Data.SqlServer.Migrations { [DbContext(typeof(InventoryDbContext))] [Migration("20221026090608_AddOrganizationId")] diff --git a/src/VirtoCommerce.InventoryModule.Data/Migrations/20221026090608_AddOrganizationId.cs b/src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/20221026090608_AddOrganizationId.cs similarity index 84% rename from src/VirtoCommerce.InventoryModule.Data/Migrations/20221026090608_AddOrganizationId.cs rename to src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/20221026090608_AddOrganizationId.cs index 4efcd01c..d00a0844 100644 --- a/src/VirtoCommerce.InventoryModule.Data/Migrations/20221026090608_AddOrganizationId.cs +++ b/src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/20221026090608_AddOrganizationId.cs @@ -1,8 +1,8 @@ -using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Migrations; #nullable disable -namespace VirtoCommerce.InventoryModule.Data.Migrations +namespace VirtoCommerce.InventoryModule.Data.SqlServer.Migrations { public partial class AddOrganizationId : Migration { diff --git a/src/VirtoCommerce.InventoryModule.Data/Migrations/InventoryDbContextModelSnapshot.cs b/src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/InventoryDbContextModelSnapshot.cs similarity index 98% rename from src/VirtoCommerce.InventoryModule.Data/Migrations/InventoryDbContextModelSnapshot.cs rename to src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/InventoryDbContextModelSnapshot.cs index a96b6f01..53639eb5 100644 --- a/src/VirtoCommerce.InventoryModule.Data/Migrations/InventoryDbContextModelSnapshot.cs +++ b/src/VirtoCommerce.InventoryModule.Data.SqlServer/Migrations/InventoryDbContextModelSnapshot.cs @@ -1,4 +1,4 @@ -// +// using System; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; @@ -8,7 +8,7 @@ #nullable disable -namespace VirtoCommerce.InventoryModule.Data.Migrations +namespace VirtoCommerce.InventoryModule.Data.SqlServer.Migrations { [DbContext(typeof(InventoryDbContext))] partial class InventoryDbContextModelSnapshot : ModelSnapshot diff --git a/src/VirtoCommerce.InventoryModule.Data.SqlServer/Readme.md b/src/VirtoCommerce.InventoryModule.Data.SqlServer/Readme.md new file mode 100644 index 00000000..d13b5028 --- /dev/null +++ b/src/VirtoCommerce.InventoryModule.Data.SqlServer/Readme.md @@ -0,0 +1,25 @@ + +## Package manager +Add-Migration Initial -Context VirtoCommerce.InventoryModule.Data.Repositories.InventoryDbContext -Verbose -OutputDir Migrations -Project VirtoCommerce.InventoryModule.Data.SqlServer -StartupProject VirtoCommerce.InventoryModule.Data.SqlServer -Debug + + + +### Entity Framework Core Commands +``` + +dotnet tool install --global dotnet-ef --version 6.* +``` + +**Generate Migrations** + +``` +dotnet ef migrations add Initial -- "{connection string}" +dotnet ef migrations add Update1 -- "{connection string}" +dotnet ef migrations add Update2 -- "{connection string}" +``` + +etc.. + +**Apply Migrations** + +`dotnet ef database update -- "{connection string}"` diff --git a/src/VirtoCommerce.InventoryModule.Data.SqlServer/SqlServerDbContextFactory.cs b/src/VirtoCommerce.InventoryModule.Data.SqlServer/SqlServerDbContextFactory.cs new file mode 100644 index 00000000..e9f442a3 --- /dev/null +++ b/src/VirtoCommerce.InventoryModule.Data.SqlServer/SqlServerDbContextFactory.cs @@ -0,0 +1,21 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Design; +using VirtoCommerce.InventoryModule.Data.Repositories; + +namespace VirtoCommerce.InventoryModule.Data.SqlServer +{ + public class SqlServerDbContextFactory : IDesignTimeDbContextFactory + { + public InventoryDbContext CreateDbContext(string[] args) + { + var builder = new DbContextOptionsBuilder(); + var connectionString = args.Any() ? args[0] : "Data Source=(local);Initial Catalog=VirtoCommerce3;Persist Security Info=True;User ID=virto;Password=virto;MultipleActiveResultSets=True;Connect Timeout=30"; + + builder.UseSqlServer( + connectionString, + db => db.MigrationsAssembly(typeof(SqlServerDbContextFactory).Assembly.GetName().Name)); + + return new InventoryDbContext(builder.Options); + } + } +} diff --git a/src/VirtoCommerce.InventoryModule.Data.SqlServer/VirtoCommerce.InventoryModule.Data.SqlServer.csproj b/src/VirtoCommerce.InventoryModule.Data.SqlServer/VirtoCommerce.InventoryModule.Data.SqlServer.csproj new file mode 100644 index 00000000..633028ec --- /dev/null +++ b/src/VirtoCommerce.InventoryModule.Data.SqlServer/VirtoCommerce.InventoryModule.Data.SqlServer.csproj @@ -0,0 +1,21 @@ + + + + net6.0 + enable + enable + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + diff --git a/src/VirtoCommerce.InventoryModule.Data/Repositories/DesignTimeDbContextFactory.cs b/src/VirtoCommerce.InventoryModule.Data/Repositories/DesignTimeDbContextFactory.cs deleted file mode 100644 index 61d30ce2..00000000 --- a/src/VirtoCommerce.InventoryModule.Data/Repositories/DesignTimeDbContextFactory.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Design; - -namespace VirtoCommerce.InventoryModule.Data.Repositories -{ - public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory - { - public InventoryDbContext CreateDbContext(string[] args) - { - var builder = new DbContextOptionsBuilder(); - - builder.UseSqlServer("Data Source=(local);Initial Catalog=VirtoCommerce3;Persist Security Info=True;User ID=virto;Password=virto;MultipleActiveResultSets=True;Connect Timeout=30"); - - return new InventoryDbContext(builder.Options); - } - } -} diff --git a/src/VirtoCommerce.InventoryModule.Data/Repositories/InventoryDbContext.cs b/src/VirtoCommerce.InventoryModule.Data/Repositories/InventoryDbContext.cs index 502933dc..2fdfdb13 100644 --- a/src/VirtoCommerce.InventoryModule.Data/Repositories/InventoryDbContext.cs +++ b/src/VirtoCommerce.InventoryModule.Data/Repositories/InventoryDbContext.cs @@ -1,3 +1,4 @@ +using System.Reflection; using EntityFrameworkCore.Triggers; using Microsoft.EntityFrameworkCore; using VirtoCommerce.InventoryModule.Data.Model; @@ -35,6 +36,22 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) modelBuilder.Entity().Property(x => x.Id).HasMaxLength(128).ValueGeneratedOnAdd(); base.OnModelCreating(modelBuilder); + + // Allows configuration for an entity type for different database types. + // Applies configuration from all + switch (this.Database.ProviderName) + { + case "Pomelo.EntityFrameworkCore.MySql": + modelBuilder.ApplyConfigurationsFromAssembly(Assembly.Load("VirtoCommerce.InventoryModule.Data.MySql")); + break; + case "Npgsql.EntityFrameworkCore.PostgreSQL": + modelBuilder.ApplyConfigurationsFromAssembly(Assembly.Load("VirtoCommerce.InventoryModule.Data.PostgreSql")); + break; + case "Microsoft.EntityFrameworkCore.SqlServer": + modelBuilder.ApplyConfigurationsFromAssembly(Assembly.Load("VirtoCommerce.InventoryModule.Data.SqlServer")); + break; + } + } #pragma warning restore S109 } diff --git a/src/VirtoCommerce.InventoryModule.Data/VirtoCommerce.InventoryModule.Data.csproj b/src/VirtoCommerce.InventoryModule.Data/VirtoCommerce.InventoryModule.Data.csproj index 75e02d74..048cc5e7 100644 --- a/src/VirtoCommerce.InventoryModule.Data/VirtoCommerce.InventoryModule.Data.csproj +++ b/src/VirtoCommerce.InventoryModule.Data/VirtoCommerce.InventoryModule.Data.csproj @@ -19,16 +19,6 @@ - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - diff --git a/src/VirtoCommerce.InventoryModule.Web/Module.cs b/src/VirtoCommerce.InventoryModule.Web/Module.cs index 33e9f52b..9684c790 100644 --- a/src/VirtoCommerce.InventoryModule.Web/Module.cs +++ b/src/VirtoCommerce.InventoryModule.Web/Module.cs @@ -14,9 +14,12 @@ using VirtoCommerce.InventoryModule.Core.Services; using VirtoCommerce.InventoryModule.Data.ExportImport; using VirtoCommerce.InventoryModule.Data.Handlers; +using VirtoCommerce.InventoryModule.Data.MySql; +using VirtoCommerce.InventoryModule.Data.PostgreSql; using VirtoCommerce.InventoryModule.Data.Repositories; using VirtoCommerce.InventoryModule.Data.Search.Indexing; using VirtoCommerce.InventoryModule.Data.Services; +using VirtoCommerce.InventoryModule.Data.SqlServer; using VirtoCommerce.Platform.Core.Bus; using VirtoCommerce.Platform.Core.Common; using VirtoCommerce.Platform.Core.ExportImport; @@ -29,9 +32,10 @@ namespace VirtoCommerce.InventoryModule.Web { - public class Module : IModule, IExportSupport, IImportSupport + public class Module : IModule, IExportSupport, IImportSupport, IHasConfiguration { public ManifestModuleInfo ModuleInfo { get; set; } + public IConfiguration Configuration { get; set; } private IApplicationBuilder _appBuilder; @@ -39,9 +43,23 @@ public void Initialize(IServiceCollection serviceCollection) { serviceCollection.AddDbContext((provider, options) => { - var configuration = provider.GetRequiredService(); - options.UseSqlServer(configuration.GetConnectionString(ModuleInfo.Id) ?? configuration.GetConnectionString("VirtoCommerce")); + var databaseProvider = Configuration.GetValue("DatabaseProvider", "SqlServer"); + var connectionString = Configuration.GetConnectionString(ModuleInfo.Id) ?? Configuration.GetConnectionString("VirtoCommerce"); + + switch (databaseProvider) + { + case "MySql": + options.UseMySqlDatabase(connectionString); + break; + case "PostgreSql": + options.UsePostgreSqlDatabase(connectionString); + break; + default: + options.UseSqlServerDatabase(connectionString); + break; + } }); + serviceCollection.AddTransient(); serviceCollection.AddTransient>(provider => () => provider.CreateScope().ServiceProvider.GetRequiredService()); serviceCollection.AddTransient(); @@ -73,9 +91,12 @@ public void PostInitialize(IApplicationBuilder appBuilder) //Force migrations using (var serviceScope = appBuilder.ApplicationServices.CreateScope()) { + var databaseProvider = Configuration.GetValue("DatabaseProvider", "SqlServer"); var inventoryDbContext = serviceScope.ServiceProvider.GetRequiredService(); - inventoryDbContext.Database.MigrateIfNotApplied(MigrationName.GetUpdateV2MigrationName(ModuleInfo.Id)); - inventoryDbContext.Database.EnsureCreated(); + if (databaseProvider == "SqlServer") + { + inventoryDbContext.Database.MigrateIfNotApplied(MigrationName.GetUpdateV2MigrationName(ModuleInfo.Id)); + } inventoryDbContext.Database.Migrate(); } diff --git a/src/VirtoCommerce.InventoryModule.Web/VirtoCommerce.InventoryModule.Web.csproj b/src/VirtoCommerce.InventoryModule.Web/VirtoCommerce.InventoryModule.Web.csproj index 4154f16b..5e336656 100644 --- a/src/VirtoCommerce.InventoryModule.Web/VirtoCommerce.InventoryModule.Web.csproj +++ b/src/VirtoCommerce.InventoryModule.Web/VirtoCommerce.InventoryModule.Web.csproj @@ -28,6 +28,9 @@ + + + \ No newline at end of file diff --git a/src/VirtoCommerce.InventoryModule.Web/module.manifest b/src/VirtoCommerce.InventoryModule.Web/module.manifest index a6afd7d7..c0b775bc 100644 --- a/src/VirtoCommerce.InventoryModule.Web/module.manifest +++ b/src/VirtoCommerce.InventoryModule.Web/module.manifest @@ -1,4 +1,4 @@ - + VirtoCommerce.Inventory 3.211.0 @@ -15,7 +15,7 @@ https://virtocommerce.com/apps/extensions/virto-inventory-module Modules/$(VirtoCommerce.Inventory)/Content/logo.png false - Copyright © 2011-2022 Virto Commerce. All rights reserved + Copyright © 2011-2023 Virto Commerce. All rights reserved order system VirtoCommerce.InventoryModule.Web.dll VirtoCommerce.InventoryModule.Web.Module, VirtoCommerce.InventoryModule.Web @@ -28,4 +28,4 @@ commerce false - \ No newline at end of file + diff --git a/tests/VirtoCommerce.InventoryModule.Tests/VirtoCommerce.InventoryModule.Tests.csproj b/tests/VirtoCommerce.InventoryModule.Tests/VirtoCommerce.InventoryModule.Tests.csproj index 45ea2567..62d658cb 100644 --- a/tests/VirtoCommerce.InventoryModule.Tests/VirtoCommerce.InventoryModule.Tests.csproj +++ b/tests/VirtoCommerce.InventoryModule.Tests/VirtoCommerce.InventoryModule.Tests.csproj @@ -5,7 +5,7 @@ false - + runtime; build; native; contentfiles; analyzers; buildtransitive all