From b78888b1711029249308ad02784b93e6643dc29f Mon Sep 17 00:00:00 2001 From: Jason Landbridge Date: Thu, 15 Dec 2022 16:28:36 +0100 Subject: [PATCH] SQLite implementation (#50) * Draft version of SQLite implementation with integration test * Added a static reference for every table name in SQLite project, this is to keep all table names consistent across database types * Added SQLite migration test * Removed shouldly import * Assert.Null instead of Assert.NotNull on recording exception * Added publish package entry for SQLite * Forgot a prefix in QuartzTriggerConfiguration * Added integration test for SQLite which ensure the created dbcontext can be used as a JobStore * Removed the static table name references from the Entities * Fixed rebase merge error * Capitalised all column names for SQLite * Changed the signature of UseSQLite to have optional prefix and schema parameters * Removed nullable strings from the EntityConfiguration and corrected readonly name format * Organised the testing files into individual folder per database type * Changed signature for the UsePostgreSql() to use prefix and schema as parameters * Changed all column names to uppercase for MySQL entity configurations * Changed signature for the UseMySql() to use prefix as parameter * Corrected namespace for MySql configurations * Corrected namespace for MySql configurations Changed signature for the UseSqlServer() to use prefix and schema as parameters * Removed obsolete UsePrefix and UseSchema * Updated Readme to reflect current supported databases and made it more clear with examples * Updated the csproj of SQLite project * Made all name spacing consistent to just `AppAny.Quartz.EntityFrameworkCore.Migrations.{{ Provider }}` * Removed extra line * Added clarification that prefix and schema can be passed as parameters * Added default parameter value for schema in UseSqlite() and UseSqlServer() --- .github/workflows/package.yaml | 6 + ....Quartz.EntityFrameworkCore.Migrations.sln | 15 +++ README.md | 118 ++++++++++++++---- ...rkCore.Migrations.MySql.csproj.DotSettings | 2 + ...uartzBlobTriggerEntityTypeConfiguration.cs | 10 +- .../QuartzCalendarEntityTypeConfiguration.cs | 8 +- ...uartzCronTriggerEntityTypeConfiguration.cs | 12 +- ...artzFiredTriggerEntityTypeConfiguration.cs | 42 +++---- .../QuartzJobDetailEntityTypeConfiguration.cs | 24 ++-- .../QuartzLockEntityTypeConfiguration.cs | 6 +- ...usedTriggerGroupEntityTypeConfiguration.cs | 6 +- ...tzSchedulerStateEntityTypeConfiguration.cs | 10 +- ...ePropertyTriggerEntityTypeConfiguration.cs | 30 ++--- ...rtzSimpleTriggerEntityTypeConfiguration.cs | 14 +-- .../QuartzTriggerEntityTypeConfiguration.cs | 40 +++--- .../QuartzModelBuilderMySqlExtensions.cs | 27 ++-- ...e.Migrations.PostgreSQL.csproj.DotSettings | 2 + .../QuartzModelBuilderPostgreSQLExtensions.cs | 28 ++--- ...tityFrameworkCore.Migrations.SQLite.csproj | 46 +++++++ ...kCore.Migrations.SQLite.csproj.DotSettings | 2 + ...uartzBlobTriggerEntityTypeConfiguration.cs | 48 +++++++ .../QuartzCalendarEntityTypeConfiguration.cs | 39 ++++++ ...uartzCronTriggerEntityTypeConfiguration.cs | 53 ++++++++ ...artzFiredTriggerEntityTypeConfiguration.cs | 107 ++++++++++++++++ .../QuartzJobDetailEntityTypeConfiguration.cs | 75 +++++++++++ .../QuartzLockEntityTypeConfiguration.cs | 34 +++++ ...usedTriggerGroupEntityTypeConfiguration.cs | 34 +++++ ...tzSchedulerStateEntityTypeConfiguration.cs | 44 +++++++ ...ePropertyTriggerEntityTypeConfiguration.cs | 93 ++++++++++++++ ...rtzSimpleTriggerEntityTypeConfiguration.cs | 59 +++++++++ .../QuartzTriggerEntityTypeConfiguration.cs | 110 ++++++++++++++++ .../QuartzModelBuilderMysqlExtensions.cs | 45 +++++++ ...re.Migrations.SqlServer.csproj.DotSettings | 2 + .../QuartzModelBuilderSqlServerExtensions.cs | 28 ++--- ...rameworkCore.Migrations.csproj.DotSettings | 2 + .../EntityTypeConfigurationContext.cs | 6 +- .../ModelBuilderExtensions.cs | 3 +- .../QuartzModelBuilder.cs | 17 --- .../QuartzModelBuilderExtensions.cs | 15 --- ...ntityFrameworkCore.Migrations.Tests.csproj | 3 + .../ConnectionStrings.cs} | 4 +- .../MySQL/MySqlIntegrationDbContext.cs | 18 +++ .../MySqlintegrationDbContext.cs | 20 --- .../IntegrationDbContextDesignTimeFactory.cs | 5 +- .../PostgreSQLIntegrationDbContext.cs | 7 +- .../PostgreSQL_IntegrationTests.cs} | 17 +-- .../SqlServerIntegrationDbContext.cs | 6 +- .../SQLite/SQLiteIntegrationDbContext.cs | 18 +++ .../SQLite/SQLite_IntegrationTests.cs | 72 +++++++++++ 49 files changed, 1185 insertions(+), 247 deletions(-) create mode 100644 src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql.csproj.DotSettings create mode 100644 src/AppAny.Quartz.EntityFrameworkCore.Migrations.PostgreSQL/AppAny.Quartz.EntityFrameworkCore.Migrations.PostgreSQL.csproj.DotSettings create mode 100644 src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite.csproj create mode 100644 src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite.csproj.DotSettings create mode 100644 src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzBlobTriggerEntityTypeConfiguration.cs create mode 100644 src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzCalendarEntityTypeConfiguration.cs create mode 100644 src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzCronTriggerEntityTypeConfiguration.cs create mode 100644 src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzFiredTriggerEntityTypeConfiguration.cs create mode 100644 src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzJobDetailEntityTypeConfiguration.cs create mode 100644 src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzLockEntityTypeConfiguration.cs create mode 100644 src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzPausedTriggerGroupEntityTypeConfiguration.cs create mode 100644 src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzSchedulerStateEntityTypeConfiguration.cs create mode 100644 src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzSimplePropertyTriggerEntityTypeConfiguration.cs create mode 100644 src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzSimpleTriggerEntityTypeConfiguration.cs create mode 100644 src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzTriggerEntityTypeConfiguration.cs create mode 100644 src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/QuartzModelBuilderMysqlExtensions.cs create mode 100644 src/AppAny.Quartz.EntityFrameworkCore.Migrations.SqlServer/AppAny.Quartz.EntityFrameworkCore.Migrations.SqlServer.csproj.DotSettings create mode 100644 src/AppAny.Quartz.EntityFrameworkCore.Migrations/AppAny.Quartz.EntityFrameworkCore.Migrations.csproj.DotSettings delete mode 100644 src/AppAny.Quartz.EntityFrameworkCore.Migrations/QuartzModelBuilderExtensions.cs rename tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/{TestSetup.cs => Base/ConnectionStrings.cs} (80%) create mode 100644 tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/MySQL/MySqlIntegrationDbContext.cs delete mode 100644 tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/MySqlintegrationDbContext.cs rename tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/{ => PostgreSQL}/IntegrationDbContextDesignTimeFactory.cs (65%) rename tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/{ => PostgreSQL}/PostgreSQLIntegrationDbContext.cs (67%) rename tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/{IntegrationTests.cs => PostgreSQL/PostgreSQL_IntegrationTests.cs} (62%) rename tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/{ => SQLServer}/SqlServerIntegrationDbContext.cs (70%) create mode 100644 tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/SQLite/SQLiteIntegrationDbContext.cs create mode 100644 tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/SQLite/SQLite_IntegrationTests.cs diff --git a/.github/workflows/package.yaml b/.github/workflows/package.yaml index e38ab66..c7b70ca 100644 --- a/.github/workflows/package.yaml +++ b/.github/workflows/package.yaml @@ -41,6 +41,12 @@ jobs: env: PROJECT: src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql.csproj VERSION: ${{ steps.release.outputs.tag }} + + - name: Package | Publish | SQLite + run: dotnet pack -c Release -o ./pack /p:Version=$VERSION $PROJECT + env: + PROJECT: src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite.csproj + VERSION: ${{ steps.release.outputs.tag }} - name: Package | Publish | SqlServer run: dotnet pack -c Release -o ./pack /p:Version=$VERSION $PROJECT diff --git a/AppAny.Quartz.EntityFrameworkCore.Migrations.sln b/AppAny.Quartz.EntityFrameworkCore.Migrations.sln index 92704a2..ad2eee4 100644 --- a/AppAny.Quartz.EntityFrameworkCore.Migrations.sln +++ b/AppAny.Quartz.EntityFrameworkCore.Migrations.sln @@ -17,6 +17,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AppAny.Quartz.EntityFramewo EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AppAny.Quartz.EntityFrameworkCore.Migrations.SqlServer", "src\AppAny.Quartz.EntityFrameworkCore.Migrations.SqlServer\AppAny.Quartz.EntityFrameworkCore.Migrations.SqlServer.csproj", "{81D33747-2D69-4E32-B2F3-1A0C7960FB9D}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite", "src\AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite\AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite.csproj", "{B43D24EE-F42A-4A0A-BE81-9431ED219BBF}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -87,6 +89,18 @@ Global {81D33747-2D69-4E32-B2F3-1A0C7960FB9D}.Release|x64.Build.0 = Release|Any CPU {81D33747-2D69-4E32-B2F3-1A0C7960FB9D}.Release|x86.ActiveCfg = Release|Any CPU {81D33747-2D69-4E32-B2F3-1A0C7960FB9D}.Release|x86.Build.0 = Release|Any CPU + {B43D24EE-F42A-4A0A-BE81-9431ED219BBF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B43D24EE-F42A-4A0A-BE81-9431ED219BBF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B43D24EE-F42A-4A0A-BE81-9431ED219BBF}.Debug|x64.ActiveCfg = Debug|Any CPU + {B43D24EE-F42A-4A0A-BE81-9431ED219BBF}.Debug|x64.Build.0 = Debug|Any CPU + {B43D24EE-F42A-4A0A-BE81-9431ED219BBF}.Debug|x86.ActiveCfg = Debug|Any CPU + {B43D24EE-F42A-4A0A-BE81-9431ED219BBF}.Debug|x86.Build.0 = Debug|Any CPU + {B43D24EE-F42A-4A0A-BE81-9431ED219BBF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B43D24EE-F42A-4A0A-BE81-9431ED219BBF}.Release|Any CPU.Build.0 = Release|Any CPU + {B43D24EE-F42A-4A0A-BE81-9431ED219BBF}.Release|x64.ActiveCfg = Release|Any CPU + {B43D24EE-F42A-4A0A-BE81-9431ED219BBF}.Release|x64.Build.0 = Release|Any CPU + {B43D24EE-F42A-4A0A-BE81-9431ED219BBF}.Release|x86.ActiveCfg = Release|Any CPU + {B43D24EE-F42A-4A0A-BE81-9431ED219BBF}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -96,6 +110,7 @@ Global {B93044E6-2EA1-4D10-932D-7D232DB02C76} = {6AAE677C-A38E-4AD0-951B-4E64D91EE928} {47E591EA-37FC-438D-96E0-EBC609BFDFA9} = {F87C6291-1953-4FD8-AE97-530A9B63B6B0} {C6D9078D-F57B-43A9-84A3-60882741022D} = {6AAE677C-A38E-4AD0-951B-4E64D91EE928} + {B43D24EE-F42A-4A0A-BE81-9431ED219BBF} = {6AAE677C-A38E-4AD0-951B-4E64D91EE928} {81D33747-2D69-4E32-B2F3-1A0C7960FB9D} = {6AAE677C-A38E-4AD0-951B-4E64D91EE928} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution diff --git a/README.md b/README.md index 277b054..6b5b00e 100644 --- a/README.md +++ b/README.md @@ -6,25 +6,50 @@ ![Tests](https://github.com/appany/AppAny.Quartz.EntityFrameworkCore.Migrations/workflows/Tests/badge.svg) [![codecov](https://codecov.io/gh/appany/AppAny.Quartz.EntityFrameworkCore.Migrations/branch/main/graph/badge.svg?token=589PU3Y1S9)](https://codecov.io/gh/appany/AppAny.Quartz.EntityFrameworkCore.Migrations) -⚡️ This library handles schema migrations for Quartz.NET using EntityFrameworkCore migrations toolkit with one line of configuration ⚡️ +⚡️ This library handles schema creation and migrations for Quartz.NET using EntityFrameworkCore migrations toolkit with one line of configuration ⚡️ + +## 💡 Supported drivers 💡 + +- [x] [MySQL](https://www.nuget.org/packages/Pomelo.EntityFrameworkCore.MySql) +- [x] [PostgreSQL](https://www.nuget.org/packages/Npgsql.EntityFrameworkCore.PostgreSQL) +- [x] [SQLite](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Sqlite) +- [x] [SQLServer](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.SqlServer) + +🚧 Feel free to **create as issue** for driver support 🚧 ## 🔧 Installation 🔧 +### MySql + ```bash -$> dotnet add package AppAny.Quartz.EntityFrameworkCore.Migrations.PostgreSQL +dotnet add package AppAny.Quartz.EntityFrameworkCore.Migrations.MySql ``` -## 💡 Supported drivers 💡 +### PostgreSQL + +```bash +dotnet add package AppAny.Quartz.EntityFrameworkCore.Migrations.PostgreSQL +``` + +### SQLite + +```bash +dotnet add package AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite +``` + +### SqlServer + +```bash +dotnet add package AppAny.Quartz.EntityFrameworkCore.Migrations.SqlServer +``` + + -- [x] [PostgreSQL](https://www.nuget.org/packages/Npgsql.EntityFrameworkCore.PostgreSQL) -- [x] [MySQL](Pomelo.EntityFrameworkCore.MySql) -- [x] [SQLServer](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.SqlServer) -🚧 Feel free to **create as issue** for driver support 🚧 ## 🎨 Usage 🎨 -✅ Configure `DbContext` +✅ Configure the `DbContext` that will hold the Quartz.NET tables ```cs public class DatabaseContext : DbContext { @@ -32,29 +57,76 @@ public class DatabaseContext : DbContext protected override void OnModelCreating(ModelBuilder modelBuilder) { + // Prefix and schema can be passed as parameters + + // Adds Quartz.NET MySql schema to EntityFrameworkCore + modelBuilder.AddQuartz(builder => builder.UseMySql()); + // Adds Quartz.NET PostgreSQL schema to EntityFrameworkCore - modelBuilder.AddQuartz(builder => builder - .UsePostgreSql() - .UseSchema("quartz") - .UseNoPrefix()); + modelBuilder.AddQuartz(builder => builder.UsePostgreSql()); + + // Adds Quartz.NET SQLite schema to EntityFrameworkCore + modelBuilder.AddQuartz(builder => builder.UseSQLite()); + + // Adds Quartz.NET SqlServer schema to EntityFrameworkCore + modelBuilder.AddQuartz(builder => builder.UseSqlServer()); } } ``` -✅ Configure `Quartz.NET` -```cs -storeOptions.UsePostgreSql(postgresOptions => +✅ (Optional) [ASP.NET Core Integration](https://www.quartz-scheduler.net/documentation/quartz-3.x/packages/aspnet-core-integration.html#using) Configuration + +```csharp +// Startup.cs +public void ConfigureServices(IServiceCollection services) { - postgresOptions.UseDriverDelegate(); - postgresOptions.ConnectionString = ...; - postgresOptions.TablePrefix = ...; -}); + services.AddQuartz(q => + { + q.UsePersistentStore(c => + { + // Use for MySQL database + c.UseMySql(mysqlOptions => + { + mysqlOptions.UseDriverDelegate(); + mysqlOptions.ConnectionString = ...; + mysqlOptions.TablePrefix = ...; + }); + + // Use for PostgresSQL database + c.UsePostgres(postgresOptions => + { + postgresOptions.UseDriverDelegate(); + postgresOptions.ConnectionString = ...; + postgresOptions.TablePrefix = ...; + }); + + // Use for SQLite database + c.UseSQLite(sqlLiteOptions => + { + sqlLiteOptions.UseDriverDelegate(); + sqlLiteOptions.ConnectionString = ...; + sqlLiteOptions.TablePrefix = ...; + }); + + // Use for SqlServer database + c.UseSqlServer(sqlServerOptions => + { + sqlServerOptions.UseDriverDelegate(); + sqlServerOptions.ConnectionString = ...; + sqlServerOptions.TablePrefix = ...; + }); + }); + }); +} + ``` -✅ Add EntityFrameworkCore migration with Quartz.NET schema `dotnet ef migrations add AddQuartz` and: +## 🚩 Finish 🚩 + +✅ Add EntityFrameworkCore migration with Quartz.NET schema `dotnet ef migrations add AddQuartz` and then -🚩 Add in-process migration using `databaseContext.Database.MigrateAsync()` +* 🚩 Add in-process migration using `databaseContext.Database.MigrateAsync()` -🚩 Add out-of-process migration using `dotnet ef database update` +* 🚩 Add out-of-process migration using `dotnet ef database update` -🚩 Extract SQL for your migration tool `dotnet ef migrations script PreviousMigration AddQuartz` +* 🚩 Extract SQL for your migration tool `dotnet ef migrations script PreviousMigration AddQuartz` diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql.csproj.DotSettings b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql.csproj.DotSettings new file mode 100644 index 0000000..2c3b12e --- /dev/null +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql.csproj.DotSettings @@ -0,0 +1,2 @@ + + True \ No newline at end of file diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzBlobTriggerEntityTypeConfiguration.cs b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzBlobTriggerEntityTypeConfiguration.cs index 4f1a860..52253ae 100644 --- a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzBlobTriggerEntityTypeConfiguration.cs +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzBlobTriggerEntityTypeConfiguration.cs @@ -14,27 +14,27 @@ public QuartzBlobTriggerEntityTypeConfiguration(string? prefix) public void Configure(EntityTypeBuilder builder) { - builder.ToTable($"{prefix}blob_triggers"); + builder.ToTable($"{prefix}BLOB_TRIGGERS"); builder.HasKey(x => new { x.SchedulerName, x.TriggerName, x.TriggerGroup }); builder.Property(x => x.SchedulerName) - .HasColumnName("sched_name") + .HasColumnName("SCHED_NAME") .HasColumnType("varchar(120)") .IsRequired(); builder.Property(x => x.TriggerName) - .HasColumnName("trigger_name") + .HasColumnName("TRIGGER_NAME") .HasColumnType("varchar(200)") .IsRequired(); builder.Property(x => x.TriggerGroup) - .HasColumnName("trigger_group") + .HasColumnName("TRIGGER_GROUP") .HasColumnType("varchar(200)") .IsRequired(); builder.Property(x => x.BlobData) - .HasColumnName("blob_data") + .HasColumnName("BLOB_DATA") .HasColumnType("blob"); builder.HasOne(x => x.Trigger) diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzCalendarEntityTypeConfiguration.cs b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzCalendarEntityTypeConfiguration.cs index de68ddf..57e1071 100644 --- a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzCalendarEntityTypeConfiguration.cs +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzCalendarEntityTypeConfiguration.cs @@ -14,22 +14,22 @@ public QuartzCalendarEntityTypeConfiguration(string? prefix) public void Configure(EntityTypeBuilder builder) { - builder.ToTable($"{prefix}calendars"); + builder.ToTable($"{prefix}CALENDARS"); builder.HasKey(x => new { x.SchedulerName, x.CalendarName }); builder.Property(x => x.SchedulerName) - .HasColumnName("sched_name") + .HasColumnName("SCHED_NAME") .HasColumnType("varchar(120)") .IsRequired(); builder.Property(x => x.CalendarName) - .HasColumnName("calendar_name") + .HasColumnName("CALENDAR_NAME") .HasColumnType("varchar(200)") .IsRequired(); builder.Property(x => x.Calendar) - .HasColumnName("calendar") + .HasColumnName("CALENDAR") .HasColumnType("blob") .IsRequired(); } diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzCronTriggerEntityTypeConfiguration.cs b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzCronTriggerEntityTypeConfiguration.cs index 9c39fb0..b35b4ae 100644 --- a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzCronTriggerEntityTypeConfiguration.cs +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzCronTriggerEntityTypeConfiguration.cs @@ -14,32 +14,32 @@ public QuartzCronTriggerEntityTypeConfiguration(string? prefix) public void Configure(EntityTypeBuilder builder) { - builder.ToTable($"{prefix}cron_triggers"); + builder.ToTable($"{prefix}CRON_TRIGGERS"); builder.HasKey(x => new { x.SchedulerName, x.TriggerName, x.TriggerGroup }); builder.Property(x => x.SchedulerName) - .HasColumnName("sched_name") + .HasColumnName("SCHED_NAME") .HasColumnType("varchar(120)") .IsRequired(); builder.Property(x => x.TriggerName) - .HasColumnName("trigger_name") + .HasColumnName("TRIGGER_NAME") .HasColumnType("varchar(200)") .IsRequired(); builder.Property(x => x.TriggerGroup) - .HasColumnName("trigger_group") + .HasColumnName("TRIGGER_GROUP") .HasColumnType("varchar(200)") .IsRequired(); builder.Property(x => x.CronExpression) - .HasColumnName("cron_expression") + .HasColumnName("CRON_EXPRESSION") .HasColumnType("varchar(120)") .IsRequired(); builder.Property(x => x.TimeZoneId) - .HasColumnName("time_zone_id") + .HasColumnName("TIME_ZONE_ID") .HasColumnType("varchar(80)"); builder.HasOne(x => x.Trigger) diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzFiredTriggerEntityTypeConfiguration.cs b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzFiredTriggerEntityTypeConfiguration.cs index fd711e8..caefa20 100644 --- a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzFiredTriggerEntityTypeConfiguration.cs +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzFiredTriggerEntityTypeConfiguration.cs @@ -14,92 +14,92 @@ public QuartzFiredTriggerEntityTypeConfiguration(string? prefix) public void Configure(EntityTypeBuilder builder) { - builder.ToTable($"{prefix}fired_triggers"); + builder.ToTable($"{prefix}FIRED_TRIGGERS"); builder.HasKey(x => new { x.SchedulerName, x.EntryId }); builder.Property(x => x.SchedulerName) - .HasColumnName("sched_name") + .HasColumnName("SCHED_NAME") .HasColumnType("varchar(120)") .IsRequired(); builder.Property(x => x.EntryId) - .HasColumnName("entry_id") + .HasColumnName("ENTRY_ID") .HasColumnType("varchar(140)") .IsRequired(); builder.Property(x => x.TriggerName) - .HasColumnName("trigger_name") + .HasColumnName("TRIGGER_NAME") .HasColumnType("varchar(200)") .IsRequired(); builder.Property(x => x.TriggerGroup) - .HasColumnName("trigger_group") + .HasColumnName("TRIGGER_GROUP") .HasColumnType("varchar(200)") .IsRequired(); builder.Property(x => x.InstanceName) - .HasColumnName("instance_name") + .HasColumnName("INSTANCE_NAME") .HasColumnType("varchar(200)") .IsRequired(); builder.Property(x => x.FiredTime) - .HasColumnName("fired_time") + .HasColumnName("FIRED_TIME") .HasColumnType("bigint(19)") .IsRequired(); builder.Property(x => x.ScheduledTime) - .HasColumnName("sched_time") + .HasColumnName("SCHED_TIME") .HasColumnType("bigint(19)") .IsRequired(); builder.Property(x => x.Priority) - .HasColumnName("priority") + .HasColumnName("PRIORITY") .HasColumnType("integer") .IsRequired(); builder.Property(x => x.State) - .HasColumnName("state") + .HasColumnName("STATE") .HasColumnType("varchar(16)") .IsRequired(); builder.Property(x => x.JobName) - .HasColumnName("job_name") + .HasColumnName("JOB_NAME") .HasColumnType("varchar(200)"); builder.Property(x => x.JobGroup) - .HasColumnName("job_group") + .HasColumnName("JOB_GROUP") .HasColumnType("varchar(200)"); builder.Property(x => x.IsNonConcurrent) - .HasColumnName("is_nonconcurrent") + .HasColumnName("IS_NONCONCURRENT") .HasColumnType("tinyint(1)") .IsRequired(); builder.Property(x => x.RequestsRecovery) - .HasColumnName("requests_recovery") + .HasColumnName("REQUESTS_RECOVERY") .HasColumnType("tinyint(1)"); builder.HasIndex(x => x.TriggerName) - .HasDatabaseName($"idx_{prefix}ft_trig_name"); + .HasDatabaseName($"IDX_{prefix}FT_TRIG_NAME"); builder.HasIndex(x => x.TriggerGroup) - .HasDatabaseName($"idx_{prefix}ft_trig_group"); + .HasDatabaseName($"IDX_{prefix}FT_TRIG_GROUP"); builder.HasIndex(x => new { x.SchedulerName, x.TriggerName, x.TriggerGroup }) - .HasDatabaseName($"idx_{prefix}ft_trig_nm_gp"); + .HasDatabaseName($"IDX_{prefix}FT_TRIG_NM_GP"); builder.HasIndex(x => x.InstanceName) - .HasDatabaseName($"idx_{prefix}ft_trig_inst_name"); + .HasDatabaseName($"IDX_{prefix}FT_TRIG_INST_NAME"); builder.HasIndex(x => x.JobName) - .HasDatabaseName($"idx_{prefix}ft_job_name"); + .HasDatabaseName($"IDX_{prefix}FT_JOB_NAME"); builder.HasIndex(x => x.JobGroup) - .HasDatabaseName($"idx_{prefix}ft_job_group"); + .HasDatabaseName($"IDX_{prefix}FT_JOB_GROUP"); builder.HasIndex(x => x.RequestsRecovery) - .HasDatabaseName($"idx_{prefix}ft_job_req_recovery"); + .HasDatabaseName($"IDX_{prefix}FT_JOB_REQ_RECOVERY"); } } } diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzJobDetailEntityTypeConfiguration.cs b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzJobDetailEntityTypeConfiguration.cs index ab7ffb7..6a4b9ac 100644 --- a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzJobDetailEntityTypeConfiguration.cs +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzJobDetailEntityTypeConfiguration.cs @@ -14,60 +14,60 @@ public QuartzJobDetailEntityTypeConfiguration(string? prefix) public void Configure(EntityTypeBuilder builder) { - builder.ToTable($"{prefix}job_details"); + builder.ToTable($"{prefix}JOB_DETAILS"); builder.HasKey(x => new { x.SchedulerName, x.JobName, x.JobGroup }); builder.Property(x => x.SchedulerName) - .HasColumnName("sched_name") + .HasColumnName("SCHED_NAME") .HasColumnType("varchar(120)") .IsRequired(); builder.Property(x => x.JobName) - .HasColumnName("job_name") + .HasColumnName("JOB_NAME") .HasColumnType("varchar(200)") .IsRequired(); builder.Property(x => x.JobGroup) - .HasColumnName("job_group") + .HasColumnName("JOB_GROUP") .HasColumnType("varchar(200)") .IsRequired(); builder.Property(x => x.Description) - .HasColumnName("description") + .HasColumnName("DESCRIPTION") .HasColumnType("varchar(250)"); builder.Property(x => x.JobClassName) - .HasColumnName("job_class_name") + .HasColumnName("JOB_CLASS_NAME") .HasColumnType("varchar(250)") .IsRequired(); builder.Property(x => x.IsDurable) - .HasColumnName("is_durable") + .HasColumnName("IS_DURABLE") .HasColumnType("tinyint(1)") .IsRequired(); builder.Property(x => x.IsNonConcurrent) - .HasColumnName("is_nonconcurrent") + .HasColumnName("IS_NONCONCURRENT") .HasColumnType("tinyint(1)") .IsRequired(); builder.Property(x => x.IsUpdateData) - .HasColumnName("is_update_data") + .HasColumnName("IS_UPDATE_DATA") .HasColumnType("tinyint(1)") .IsRequired(); builder.Property(x => x.RequestsRecovery) - .HasColumnName("requests_recovery") + .HasColumnName("REQUESTS_RECOVERY") .HasColumnType("tinyint(1)") .IsRequired(); builder.Property(x => x.JobData) - .HasColumnName("job_data") + .HasColumnName("JOB_DATA") .HasColumnType("blob"); builder.HasIndex(x => x.RequestsRecovery) - .HasDatabaseName($"idx_{prefix}j_req_recovery"); + .HasDatabaseName($"IDX_{prefix}J_REQ_RECOVERY"); } } } diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzLockEntityTypeConfiguration.cs b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzLockEntityTypeConfiguration.cs index 39b48ec..68b887d 100644 --- a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzLockEntityTypeConfiguration.cs +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzLockEntityTypeConfiguration.cs @@ -14,17 +14,17 @@ public QuartzLockEntityTypeConfiguration(string? prefix) public void Configure(EntityTypeBuilder builder) { - builder.ToTable($"{prefix}locks"); + builder.ToTable($"{prefix}LOCKS"); builder.HasKey(x => new { x.SchedulerName, x.LockName }); builder.Property(x => x.SchedulerName) - .HasColumnName("sched_name") + .HasColumnName("SCHED_NAME") .HasColumnType("varchar(120)") .IsRequired(); builder.Property(x => x.LockName) - .HasColumnName("lock_name") + .HasColumnName("LOCK_NAME") .HasColumnType("varchar(40)") .IsRequired(); } diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzPausedTriggerGroupEntityTypeConfiguration.cs b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzPausedTriggerGroupEntityTypeConfiguration.cs index 5eb1a02..e42721b 100644 --- a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzPausedTriggerGroupEntityTypeConfiguration.cs +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzPausedTriggerGroupEntityTypeConfiguration.cs @@ -14,17 +14,17 @@ public QuartzPausedTriggerGroupEntityTypeConfiguration(string? prefix) public void Configure(EntityTypeBuilder builder) { - builder.ToTable($"{prefix}paused_trigger_grps"); + builder.ToTable($"{prefix}PAUSED_TRIGGER_GRPS"); builder.HasKey(x => new { x.SchedulerName, x.TriggerGroup }); builder.Property(x => x.SchedulerName) - .HasColumnName("sched_name") + .HasColumnName("SCHED_NAME") .HasColumnType("varchar(120)") .IsRequired(); builder.Property(x => x.TriggerGroup) - .HasColumnName("trigger_group") + .HasColumnName("TRIGGER_GROUP") .HasColumnType("varchar(200)") .IsRequired(); } diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzSchedulerStateEntityTypeConfiguration.cs b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzSchedulerStateEntityTypeConfiguration.cs index 0902e38..2787643 100644 --- a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzSchedulerStateEntityTypeConfiguration.cs +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzSchedulerStateEntityTypeConfiguration.cs @@ -14,27 +14,27 @@ public QuartzSchedulerStateEntityTypeConfiguration(string? prefix) public void Configure(EntityTypeBuilder builder) { - builder.ToTable($"{prefix}scheduler_state"); + builder.ToTable($"{prefix}SCHEDULER_STATE"); builder.HasKey(x => new { x.SchedulerName, x.InstanceName }); builder.Property(x => x.SchedulerName) - .HasColumnName("sched_name") + .HasColumnName("SCHED_NAME") .HasColumnType("varchar(120)") .IsRequired(); builder.Property(x => x.InstanceName) - .HasColumnName("instance_name") + .HasColumnName("INSTANCE_NAME") .HasColumnType("varchar(200)") .IsRequired(); builder.Property(x => x.LastCheckInTime) - .HasColumnName("last_checkin_time") + .HasColumnName("LAST_CHECKIN_TIME") .HasColumnType("bigint(19)") .IsRequired(); builder.Property(x => x.CheckInInterval) - .HasColumnName("checkin_interval") + .HasColumnName("CHECKIN_INTERVAL") .HasColumnType("bigint(19)") .IsRequired(); } diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzSimplePropertyTriggerEntityTypeConfiguration.cs b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzSimplePropertyTriggerEntityTypeConfiguration.cs index 0a7957b..b5da48a 100644 --- a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzSimplePropertyTriggerEntityTypeConfiguration.cs +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzSimplePropertyTriggerEntityTypeConfiguration.cs @@ -19,66 +19,66 @@ public void Configure(EntityTypeBuilder builder) builder.HasKey(x => new { x.SchedulerName, x.TriggerName, x.TriggerGroup }); builder.Property(x => x.SchedulerName) - .HasColumnName("sched_name") + .HasColumnName("SCHED_NAME") .HasColumnType("varchar(120)") .IsRequired(); builder.Property(x => x.TriggerName) - .HasColumnName("trigger_name") + .HasColumnName("TRIGGER_NAME") .HasColumnType("varchar(200)") .IsRequired(); builder.Property(x => x.TriggerGroup) - .HasColumnName("trigger_group") + .HasColumnName("TRIGGER_GROUP") .HasColumnType("varchar(200)") .IsRequired(); builder.Property(x => x.StringProperty1) - .HasColumnName("str_prop_1") + .HasColumnName("STR_PROP_1") .HasColumnType("varchar(512)"); builder.Property(x => x.StringProperty2) - .HasColumnName("str_prop_2") + .HasColumnName("STR_PROP_2") .HasColumnType("varchar(512)"); builder.Property(x => x.StringProperty3) - .HasColumnName("str_prop_3") + .HasColumnName("STR_PROP_3") .HasColumnType("varchar(512)"); builder.Property(x => x.IntegerProperty1) - .HasColumnName("int_prop_1") + .HasColumnName("INT_PROP_1") .HasColumnType("int"); builder.Property(x => x.IntegerProperty2) - .HasColumnName("int_prop_2") + .HasColumnName("INT_PROP_2") .HasColumnType("int"); builder.Property(x => x.LongProperty1) - .HasColumnName("long_prop_1") + .HasColumnName("LONG_PROP_1") .HasColumnType("BIGINT"); builder.Property(x => x.LongProperty2) - .HasColumnName("long_prop_2") + .HasColumnName("LONG_PROP_2") .HasColumnType("BIGINT"); builder.Property(x => x.DecimalProperty1) - .HasColumnName("dec_prop_1") + .HasColumnName("DEC_PROP_1") .HasColumnType("NUMERIC(13,4)"); builder.Property(x => x.DecimalProperty2) - .HasColumnName("dec_prop_2") + .HasColumnName("DEC_PROP_2") .HasColumnType("NUMERIC(13,4)"); builder.Property(x => x.BooleanProperty1) - .HasColumnName("bool_prop_1") + .HasColumnName("BOOL_PROP_1") .HasColumnType("tinyint(1)"); builder.Property(x => x.BooleanProperty2) - .HasColumnName("bool_prop_2") + .HasColumnName("BOOL_PROP_2") .HasColumnType("tinyint(1)"); builder.Property(x => x.TimeZoneId) - .HasColumnName("time_zone_id") + .HasColumnName("TIME_ZONE_ID") .HasColumnType("varchar(80)"); builder.HasOne(x => x.Trigger) diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzSimpleTriggerEntityTypeConfiguration.cs b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzSimpleTriggerEntityTypeConfiguration.cs index d9ea848..b21ffe3 100644 --- a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzSimpleTriggerEntityTypeConfiguration.cs +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzSimpleTriggerEntityTypeConfiguration.cs @@ -14,37 +14,37 @@ public QuartzSimpleTriggerEntityTypeConfiguration(string? prefix) public void Configure(EntityTypeBuilder builder) { - builder.ToTable($"{prefix}simple_triggers"); + builder.ToTable($"{prefix}SIMPLE_TRIGGERS"); builder.HasKey(x => new { x.SchedulerName, x.TriggerName, x.TriggerGroup }); builder.Property(x => x.SchedulerName) - .HasColumnName("sched_name") + .HasColumnName("SCHED_NAME") .HasColumnType("varchar(120)") .IsRequired(); builder.Property(x => x.TriggerName) - .HasColumnName("trigger_name") + .HasColumnName("TRIGGER_NAME") .HasColumnType("varchar(200)") .IsRequired(); builder.Property(x => x.TriggerGroup) - .HasColumnName("trigger_group") + .HasColumnName("TRIGGER_GROUP") .HasColumnType("varchar(200)") .IsRequired(); builder.Property(x => x.RepeatCount) - .HasColumnName("repeat_count") + .HasColumnName("REPEAT_COUNT") .HasColumnType("bigint(7)") .IsRequired(); builder.Property(x => x.RepeatInterval) - .HasColumnName("repeat_interval") + .HasColumnName("REPEAT_INTERVAL") .HasColumnType("bigint(12)") .IsRequired(); builder.Property(x => x.TimesTriggered) - .HasColumnName("times_triggered") + .HasColumnName("TIMES_TRIGGERED") .HasColumnType("bigint(10)") .IsRequired(); diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzTriggerEntityTypeConfiguration.cs b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzTriggerEntityTypeConfiguration.cs index b29da8d..3f07616 100644 --- a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzTriggerEntityTypeConfiguration.cs +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzTriggerEntityTypeConfiguration.cs @@ -14,80 +14,80 @@ public QuartzTriggerEntityTypeConfiguration(string? prefix) public void Configure(EntityTypeBuilder builder) { - builder.ToTable($"{prefix}triggers"); + builder.ToTable($"{prefix}TRIGGERS"); builder.HasKey(x => new { x.SchedulerName, x.TriggerName, x.TriggerGroup }); builder.Property(x => x.SchedulerName) - .HasColumnName("sched_name") + .HasColumnName("SCHED_NAME") .HasColumnType("varchar(120)") .IsRequired(); builder.Property(x => x.TriggerName) - .HasColumnName("trigger_name") + .HasColumnName("TRIGGER_NAME") .HasColumnType("varchar(200)") .IsRequired(); builder.Property(x => x.TriggerGroup) - .HasColumnName("trigger_group") + .HasColumnName("TRIGGER_GROUP") .HasColumnType("varchar(200)") .IsRequired(); builder.Property(x => x.JobName) - .HasColumnName("job_name") + .HasColumnName("JOB_NAME") .HasColumnType("varchar(200)") .IsRequired(); builder.Property(x => x.JobGroup) - .HasColumnName("job_group") + .HasColumnName("JOB_GROUP") .HasColumnType("varchar(200)") .IsRequired(); builder.Property(x => x.Description) - .HasColumnName("description") + .HasColumnName("DESCRIPTION") .HasColumnType("varchar(250)"); builder.Property(x => x.NextFireTime) - .HasColumnName("next_fire_time") + .HasColumnName("NEXT_FIRE_TIME") .HasColumnType("bigint(19)"); builder.Property(x => x.PreviousFireTime) - .HasColumnName("prev_fire_time") + .HasColumnName("PREV_FIRE_TIME") .HasColumnType("bigint(19)"); builder.Property(x => x.Priority) - .HasColumnName("priority") + .HasColumnName("PRIORITY") .HasColumnType("integer"); builder.Property(x => x.TriggerState) - .HasColumnName("trigger_state") + .HasColumnName("TRIGGER_STATE") .HasColumnType("varchar(16)") .IsRequired(); builder.Property(x => x.TriggerType) - .HasColumnName("trigger_type") + .HasColumnName("TRIGGER_TYPE") .HasColumnType("varchar(8)") .IsRequired(); builder.Property(x => x.StartTime) - .HasColumnName("start_time") + .HasColumnName("START_TIME") .HasColumnType("bigint(19)") .IsRequired(); builder.Property(x => x.EndTime) - .HasColumnName("end_time") + .HasColumnName("END_TIME") .HasColumnType("bigint(19)"); builder.Property(x => x.CalendarName) - .HasColumnName("calendar_name") + .HasColumnName("CALENDAR_NAME") .HasColumnType("varchar(200)"); builder.Property(x => x.MisfireInstruction) - .HasColumnName("misfire_instr") + .HasColumnName("MISFIRE_INSTR") .HasColumnType("smallint(2)"); builder.Property(x => x.JobData) - .HasColumnName("job_data") + .HasColumnName("JOB_DATA") .HasColumnType("blob"); builder.HasOne(x => x.JobDetail) @@ -96,13 +96,13 @@ public void Configure(EntityTypeBuilder builder) .IsRequired(); builder.HasIndex(x => x.NextFireTime) - .HasDatabaseName($"idx_{prefix}t_next_fire_time"); + .HasDatabaseName($"IDX_{prefix}T_NEXT_FIRE_TIME"); builder.HasIndex(x => x.TriggerState) - .HasDatabaseName($"idx_{prefix}t_state"); + .HasDatabaseName($"IDX_{prefix}T_STATE"); builder.HasIndex(x => new { x.NextFireTime, x.TriggerState }) - .HasDatabaseName($"idx_{prefix}t_nft_st"); + .HasDatabaseName($"IDX_{prefix}T_NFT_ST"); } } } diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/QuartzModelBuilderMySqlExtensions.cs b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/QuartzModelBuilderMySqlExtensions.cs index 964d76e..58c107c 100644 --- a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/QuartzModelBuilderMySqlExtensions.cs +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/QuartzModelBuilderMySqlExtensions.cs @@ -2,44 +2,43 @@ namespace AppAny.Quartz.EntityFrameworkCore.Migrations.MySql { public static class QuartzModelBuilderMySqlExtensions { - public const string DefaultPrefix = "QRTZ_"; - public static QuartzModelBuilder UseMySql(this QuartzModelBuilder builder) + public static QuartzModelBuilder UseMySql(this QuartzModelBuilder builder, string prefix = "QRTZ_") { - builder.UsePrefix(DefaultPrefix).UseEntityTypeConfigurations(context => + builder.UseEntityTypeConfigurations(context => { context.ModelBuilder.ApplyConfiguration( - new QuartzJobDetailEntityTypeConfiguration(context.Prefix)); + new QuartzJobDetailEntityTypeConfiguration(prefix)); context.ModelBuilder.ApplyConfiguration( - new QuartzTriggerEntityTypeConfiguration(context.Prefix)); + new QuartzTriggerEntityTypeConfiguration(prefix)); context.ModelBuilder.ApplyConfiguration( - new QuartzSimpleTriggerEntityTypeConfiguration(context.Prefix)); + new QuartzSimpleTriggerEntityTypeConfiguration(prefix)); context.ModelBuilder.ApplyConfiguration( - new QuartzSimplePropertyTriggerEntityTypeConfiguration(context.Prefix)); + new QuartzSimplePropertyTriggerEntityTypeConfiguration(prefix)); context.ModelBuilder.ApplyConfiguration( - new QuartzCronTriggerEntityTypeConfiguration(context.Prefix)); + new QuartzCronTriggerEntityTypeConfiguration(prefix)); context.ModelBuilder.ApplyConfiguration( - new QuartzBlobTriggerEntityTypeConfiguration(context.Prefix)); + new QuartzBlobTriggerEntityTypeConfiguration(prefix)); context.ModelBuilder.ApplyConfiguration( - new QuartzCalendarEntityTypeConfiguration(context.Prefix)); + new QuartzCalendarEntityTypeConfiguration(prefix)); context.ModelBuilder.ApplyConfiguration( - new QuartzPausedTriggerGroupEntityTypeConfiguration(context.Prefix)); + new QuartzPausedTriggerGroupEntityTypeConfiguration(prefix)); context.ModelBuilder.ApplyConfiguration( - new QuartzFiredTriggerEntityTypeConfiguration(context.Prefix)); + new QuartzFiredTriggerEntityTypeConfiguration(prefix)); context.ModelBuilder.ApplyConfiguration( - new QuartzSchedulerStateEntityTypeConfiguration(context.Prefix)); + new QuartzSchedulerStateEntityTypeConfiguration(prefix)); context.ModelBuilder.ApplyConfiguration( - new QuartzLockEntityTypeConfiguration(context.Prefix)); + new QuartzLockEntityTypeConfiguration(prefix)); }); return builder; diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.PostgreSQL/AppAny.Quartz.EntityFrameworkCore.Migrations.PostgreSQL.csproj.DotSettings b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.PostgreSQL/AppAny.Quartz.EntityFrameworkCore.Migrations.PostgreSQL.csproj.DotSettings new file mode 100644 index 0000000..2c3b12e --- /dev/null +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.PostgreSQL/AppAny.Quartz.EntityFrameworkCore.Migrations.PostgreSQL.csproj.DotSettings @@ -0,0 +1,2 @@ + + True \ No newline at end of file diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.PostgreSQL/QuartzModelBuilderPostgreSQLExtensions.cs b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.PostgreSQL/QuartzModelBuilderPostgreSQLExtensions.cs index 0fd84e4..f590c3c 100644 --- a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.PostgreSQL/QuartzModelBuilderPostgreSQLExtensions.cs +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.PostgreSQL/QuartzModelBuilderPostgreSQLExtensions.cs @@ -2,44 +2,42 @@ namespace AppAny.Quartz.EntityFrameworkCore.Migrations.PostgreSQL { public static class QuartzModelBuilderPostgreSqlExtensions { - public const string DefaultPrefix = "qrtz_"; - - public static QuartzModelBuilder UsePostgreSql(this QuartzModelBuilder builder) + public static QuartzModelBuilder UsePostgreSql(this QuartzModelBuilder builder, string prefix = "qrtz_", string schema = "quartz") { - builder.UsePrefix(DefaultPrefix).UseEntityTypeConfigurations(context => + builder.UseEntityTypeConfigurations(context => { context.ModelBuilder.ApplyConfiguration( - new QuartzJobDetailEntityTypeConfiguration(context.Prefix, context.Schema)); + new QuartzJobDetailEntityTypeConfiguration(prefix, schema)); context.ModelBuilder.ApplyConfiguration( - new QuartzTriggerEntityTypeConfiguration(context.Prefix, context.Schema)); + new QuartzTriggerEntityTypeConfiguration(prefix, schema)); context.ModelBuilder.ApplyConfiguration( - new QuartzSimpleTriggerEntityTypeConfiguration(context.Prefix, context.Schema)); + new QuartzSimpleTriggerEntityTypeConfiguration(prefix, schema)); context.ModelBuilder.ApplyConfiguration( - new QuartzSimplePropertyTriggerEntityTypeConfiguration(context.Prefix, context.Schema)); + new QuartzSimplePropertyTriggerEntityTypeConfiguration(prefix, schema)); context.ModelBuilder.ApplyConfiguration( - new QuartzCronTriggerEntityTypeConfiguration(context.Prefix, context.Schema)); + new QuartzCronTriggerEntityTypeConfiguration(prefix, schema)); context.ModelBuilder.ApplyConfiguration( - new QuartzBlobTriggerEntityTypeConfiguration(context.Prefix, context.Schema)); + new QuartzBlobTriggerEntityTypeConfiguration(prefix, schema)); context.ModelBuilder.ApplyConfiguration( - new QuartzCalendarEntityTypeConfiguration(context.Prefix, context.Schema)); + new QuartzCalendarEntityTypeConfiguration(prefix, schema)); context.ModelBuilder.ApplyConfiguration( - new QuartzPausedTriggerGroupEntityTypeConfiguration(context.Prefix, context.Schema)); + new QuartzPausedTriggerGroupEntityTypeConfiguration(prefix, schema)); context.ModelBuilder.ApplyConfiguration( - new QuartzFiredTriggerEntityTypeConfiguration(context.Prefix, context.Schema)); + new QuartzFiredTriggerEntityTypeConfiguration(prefix, schema)); context.ModelBuilder.ApplyConfiguration( - new QuartzSchedulerStateEntityTypeConfiguration(context.Prefix, context.Schema)); + new QuartzSchedulerStateEntityTypeConfiguration(prefix, schema)); context.ModelBuilder.ApplyConfiguration( - new QuartzLockEntityTypeConfiguration(context.Prefix, context.Schema)); + new QuartzLockEntityTypeConfiguration(prefix, schema)); }); return builder; diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite.csproj b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite.csproj new file mode 100644 index 0000000..054b324 --- /dev/null +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite.csproj @@ -0,0 +1,46 @@ + + + + net6.0 + enable + enable + 10 + true + true + true + + + + git + https://github.com/appany/AppAny.Quartz.EntityFrameworkCore.Migrations + https://github.com/appany/AppAny.Quartz.EntityFrameworkCore.Migrations + logo.png + LICENSE + Copyright ©2022 AppAny + JasonLandbridge + EntityFrameworkCore SQLite migrations for Quartz.NET + .NET Core;ASP.NET Core;EntityFrameworkCore;Quartz.NET;SQLite + + + + + + + + + + + + + true + false + + + + true + false + + + + + diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite.csproj.DotSettings b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite.csproj.DotSettings new file mode 100644 index 0000000..2c3b12e --- /dev/null +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite.csproj.DotSettings @@ -0,0 +1,2 @@ + + True \ No newline at end of file diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzBlobTriggerEntityTypeConfiguration.cs b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzBlobTriggerEntityTypeConfiguration.cs new file mode 100644 index 0000000..4a26d0a --- /dev/null +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzBlobTriggerEntityTypeConfiguration.cs @@ -0,0 +1,48 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite; + +public class QuartzBlobTriggerEntityTypeConfiguration : IEntityTypeConfiguration +{ + private readonly string _prefix; + private readonly string _schema; + + public QuartzBlobTriggerEntityTypeConfiguration(string prefix, string schema) + { + this._prefix = prefix; + this._schema = schema; + } + + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(_prefix + "BLOB_TRIGGERS", _schema); + + builder.HasKey(x => new { x.SchedulerName, x.TriggerName, x.TriggerGroup }); + + builder.Property(x => x.SchedulerName) + .HasColumnName("SCHED_NAME") + .HasColumnType("text") + .IsRequired(); + + builder.Property(x => x.TriggerName) + .HasColumnName("TRIGGER_NAME") + .HasColumnType("text") + .IsRequired(); + + builder.Property(x => x.TriggerGroup) + .HasColumnName("TRIGGER_GROUP") + .HasColumnType("text") + .IsRequired(); + + builder.Property(x => x.BlobData) + .HasColumnName("BLOB_DATA") + .HasColumnType("bytea"); + + builder.HasOne(x => x.Trigger) + .WithMany(x => x.BlobTriggers) + .HasForeignKey(x => new { x.SchedulerName, x.TriggerName, x.TriggerGroup }) + .OnDelete(DeleteBehavior.Cascade); + } +} + diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzCalendarEntityTypeConfiguration.cs b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzCalendarEntityTypeConfiguration.cs new file mode 100644 index 0000000..7fd4af4 --- /dev/null +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzCalendarEntityTypeConfiguration.cs @@ -0,0 +1,39 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite; + +public class QuartzCalendarEntityTypeConfiguration : IEntityTypeConfiguration +{ + private readonly string _prefix; + private readonly string _schema; + + public QuartzCalendarEntityTypeConfiguration(string prefix, string schema) + { + this._prefix = prefix; + this._schema = schema; + } + + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(_prefix + "CALENDARS", _schema); + + builder.HasKey(x => new { x.SchedulerName, x.CalendarName }); + + builder.Property(x => x.SchedulerName) + .HasColumnName("SCHED_NAME") + .HasColumnType("text") + .IsRequired(); + + builder.Property(x => x.CalendarName) + .HasColumnName("CALENDAR_NAME") + .HasColumnType("text") + .IsRequired(); + + builder.Property(x => x.Calendar) + .HasColumnName("CALENDAR") + .HasColumnType("bytea") + .IsRequired(); + } +} + diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzCronTriggerEntityTypeConfiguration.cs b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzCronTriggerEntityTypeConfiguration.cs new file mode 100644 index 0000000..fc748c0 --- /dev/null +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzCronTriggerEntityTypeConfiguration.cs @@ -0,0 +1,53 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite; + +public class QuartzCronTriggerEntityTypeConfiguration : IEntityTypeConfiguration +{ + private readonly string _prefix; + private readonly string _schema; + + public QuartzCronTriggerEntityTypeConfiguration(string prefix, string schema) + { + this._prefix = prefix; + this._schema = schema; + } + + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(_prefix + "CRON_TRIGGERS", _schema); + + builder.HasKey(x => new { x.SchedulerName, x.TriggerName, x.TriggerGroup }); + + builder.Property(x => x.SchedulerName) + .HasColumnName("SCHED_NAME") + .HasColumnType("text") + .IsRequired(); + + builder.Property(x => x.TriggerName) + .HasColumnName("TRIGGER_NAME") + .HasColumnType("text") + .IsRequired(); + + builder.Property(x => x.TriggerGroup) + .HasColumnName("TRIGGER_GROUP") + .HasColumnType("text") + .IsRequired(); + + builder.Property(x => x.CronExpression) + .HasColumnName("CRON_EXPRESSION") + .HasColumnType("text") + .IsRequired(); + + builder.Property(x => x.TimeZoneId) + .HasColumnName("TIME_ZONE_ID") + .HasColumnType("text"); + + builder.HasOne(x => x.Trigger) + .WithMany(x => x.CronTriggers) + .HasForeignKey(x => new { x.SchedulerName, x.TriggerName, x.TriggerGroup }) + .OnDelete(DeleteBehavior.Cascade); + } +} + diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzFiredTriggerEntityTypeConfiguration.cs b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzFiredTriggerEntityTypeConfiguration.cs new file mode 100644 index 0000000..9fe395e --- /dev/null +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzFiredTriggerEntityTypeConfiguration.cs @@ -0,0 +1,107 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite; + +public class QuartzFiredTriggerEntityTypeConfiguration : IEntityTypeConfiguration +{ + private readonly string _prefix; + private readonly string _schema; + + public QuartzFiredTriggerEntityTypeConfiguration(string prefix, string schema) + { + this._prefix = prefix; + this._schema = schema; + } + + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(_prefix + "FIRED_TRIGGERS", _schema); + + builder.HasKey(x => new { x.SchedulerName, x.EntryId }); + + builder.Property(x => x.SchedulerName) + .HasColumnName("SCHED_NAME") + .HasColumnType("text") + .IsRequired(); + + builder.Property(x => x.EntryId) + .HasColumnName("ENTRY_ID") + .HasColumnType("text") + .IsRequired(); + + builder.Property(x => x.TriggerName) + .HasColumnName("TRIGGER_NAME") + .HasColumnType("text") + .IsRequired(); + + builder.Property(x => x.TriggerGroup) + .HasColumnName("TRIGGER_GROUP") + .HasColumnType("text") + .IsRequired(); + + builder.Property(x => x.InstanceName) + .HasColumnName("INSTANCE_NAME") + .HasColumnType("text") + .IsRequired(); + + builder.Property(x => x.FiredTime) + .HasColumnName("FIRED_TIME") + .HasColumnType("bigint") + .IsRequired(); + + builder.Property(x => x.ScheduledTime) + .HasColumnName("SCHED_TIME") + .HasColumnType("bigint") + .IsRequired(); + + builder.Property(x => x.Priority) + .HasColumnName("PRIORITY") + .HasColumnType("integer") + .IsRequired(); + + builder.Property(x => x.State) + .HasColumnName("STATE") + .HasColumnType("text") + .IsRequired(); + + builder.Property(x => x.JobName) + .HasColumnName("JOB_NAME") + .HasColumnType("text"); + + builder.Property(x => x.JobGroup) + .HasColumnName("JOB_GROUP") + .HasColumnType("text"); + + builder.Property(x => x.IsNonConcurrent) + .HasColumnName("IS_NONCONCURRENT") + .HasColumnType("bool") + .IsRequired(); + + builder.Property(x => x.RequestsRecovery) + .HasColumnName("REQUESTS_RECOVERY") + .HasColumnType("bool"); + + builder.HasIndex(x => x.TriggerName) + .HasDatabaseName($"IDX_{_prefix}FT_TRIG_NAME"); + + builder.HasIndex(x => x.TriggerGroup) + .HasDatabaseName($"IDX_{_prefix}FT_TRIG_GROUP"); + + builder.HasIndex(x => new { x.SchedulerName, x.TriggerName, x.TriggerGroup }) + .HasDatabaseName($"IDX_{_prefix}FT_TRIG_NM_GP"); + + builder.HasIndex(x => x.InstanceName) + .HasDatabaseName($"IDX_{_prefix}FT_TRIG_INST_NAME"); + + builder.HasIndex(x => x.JobName) + .HasDatabaseName($"IDX_{_prefix}FT_JOB_NAME"); + + builder.HasIndex(x => x.JobGroup) + .HasDatabaseName($"IDX_{_prefix}FT_JOB_GROUP"); + + builder.HasIndex(x => x.RequestsRecovery) + .HasDatabaseName($"IDX_{_prefix}FT_JOB_REQ_RECOVERY"); + } +} + diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzJobDetailEntityTypeConfiguration.cs b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzJobDetailEntityTypeConfiguration.cs new file mode 100644 index 0000000..fcca35d --- /dev/null +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzJobDetailEntityTypeConfiguration.cs @@ -0,0 +1,75 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite; + +public class QuartzJobDetailEntityTypeConfiguration : IEntityTypeConfiguration +{ + private readonly string _prefix; + private readonly string _schema; + + public QuartzJobDetailEntityTypeConfiguration(string prefix, string schema) + { + this._prefix = prefix; + this._schema = schema; + } + + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(_prefix + "JOB_DETAILS", _schema); + + builder.HasKey(x => new { x.SchedulerName, x.JobName, x.JobGroup }); + + builder.Property(x => x.SchedulerName) + .HasColumnName("SCHED_NAME") + .HasColumnType("text") + .IsRequired(); + + builder.Property(x => x.JobName) + .HasColumnName("JOB_NAME") + .HasColumnType("text") + .IsRequired(); + + builder.Property(x => x.JobGroup) + .HasColumnName("JOB_GROUP") + .HasColumnType("text") + .IsRequired(); + + builder.Property(x => x.Description) + .HasColumnName("DESCRIPTION") + .HasColumnType("text"); + + builder.Property(x => x.JobClassName) + .HasColumnName("JOB_CLASS_NAME") + .HasColumnType("text") + .IsRequired(); + + builder.Property(x => x.IsDurable) + .HasColumnName("IS_DURABLE") + .HasColumnType("bool") + .IsRequired(); + + builder.Property(x => x.IsNonConcurrent) + .HasColumnName("IS_NONCONCURRENT") + .HasColumnType("bool") + .IsRequired(); + + builder.Property(x => x.IsUpdateData) + .HasColumnName("IS_UPDATE_DATA") + .HasColumnType("bool") + .IsRequired(); + + builder.Property(x => x.RequestsRecovery) + .HasColumnName("REQUESTS_RECOVERY") + .HasColumnType("bool") + .IsRequired(); + + builder.Property(x => x.JobData) + .HasColumnName("JOB_DATA") + .HasColumnType("bytea"); + + builder.HasIndex(x => x.RequestsRecovery) + .HasDatabaseName($"IDX_{_prefix}J_REQ_RECOVERY"); + } +} + diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzLockEntityTypeConfiguration.cs b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzLockEntityTypeConfiguration.cs new file mode 100644 index 0000000..3936fa4 --- /dev/null +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzLockEntityTypeConfiguration.cs @@ -0,0 +1,34 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite; + +public class QuartzLockEntityTypeConfiguration : IEntityTypeConfiguration +{ + private readonly string _prefix; + private readonly string _schema; + + public QuartzLockEntityTypeConfiguration(string prefix, string schema) + { + this._prefix = prefix; + this._schema = schema; + } + + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(_prefix + "LOCKS", _schema); + + builder.HasKey(x => new { x.SchedulerName, x.LockName }); + + builder.Property(x => x.SchedulerName) + .HasColumnName("SCHED_NAME") + .HasColumnType("text") + .IsRequired(); + + builder.Property(x => x.LockName) + .HasColumnName("LOCK_NAME") + .HasColumnType("text") + .IsRequired(); + } +} + diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzPausedTriggerGroupEntityTypeConfiguration.cs b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzPausedTriggerGroupEntityTypeConfiguration.cs new file mode 100644 index 0000000..4f42947 --- /dev/null +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzPausedTriggerGroupEntityTypeConfiguration.cs @@ -0,0 +1,34 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite; + +public class QuartzPausedTriggerGroupEntityTypeConfiguration : IEntityTypeConfiguration +{ + private readonly string _prefix; + private readonly string _schema; + + public QuartzPausedTriggerGroupEntityTypeConfiguration(string prefix, string schema) + { + this._prefix = prefix; + this._schema = schema; + } + + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(_prefix + "PAUSED_TRIGGER_GRPS", _schema); + + builder.HasKey(x => new { x.SchedulerName, x.TriggerGroup }); + + builder.Property(x => x.SchedulerName) + .HasColumnName("SCHED_NAME") + .HasColumnType("text") + .IsRequired(); + + builder.Property(x => x.TriggerGroup) + .HasColumnName("TRIGGER_GROUP") + .HasColumnType("text") + .IsRequired(); + } +} + diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzSchedulerStateEntityTypeConfiguration.cs b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzSchedulerStateEntityTypeConfiguration.cs new file mode 100644 index 0000000..8f61278 --- /dev/null +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzSchedulerStateEntityTypeConfiguration.cs @@ -0,0 +1,44 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite; + +public class QuartzSchedulerStateEntityTypeConfiguration : IEntityTypeConfiguration +{ + private readonly string _prefix; + private readonly string _schema; + + public QuartzSchedulerStateEntityTypeConfiguration(string prefix, string schema) + { + this._prefix = prefix; + this._schema = schema; + } + + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(_prefix + "SCHEDULER_STATE", _schema); + + builder.HasKey(x => new { x.SchedulerName, x.InstanceName }); + + builder.Property(x => x.SchedulerName) + .HasColumnName("SCHED_NAME") + .HasColumnType("text") + .IsRequired(); + + builder.Property(x => x.InstanceName) + .HasColumnName("INSTANCE_NAME") + .HasColumnType("text") + .IsRequired(); + + builder.Property(x => x.LastCheckInTime) + .HasColumnName("LAST_CHECKIN_TIME") + .HasColumnType("bigint") + .IsRequired(); + + builder.Property(x => x.CheckInInterval) + .HasColumnName("CHECKIN_INTERVAL") + .HasColumnType("bigint") + .IsRequired(); + } +} + diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzSimplePropertyTriggerEntityTypeConfiguration.cs b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzSimplePropertyTriggerEntityTypeConfiguration.cs new file mode 100644 index 0000000..f4d2588 --- /dev/null +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzSimplePropertyTriggerEntityTypeConfiguration.cs @@ -0,0 +1,93 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite; + +public class QuartzSimplePropertyTriggerEntityTypeConfiguration + : IEntityTypeConfiguration +{ + private readonly string _prefix; + private readonly string _schema; + + public QuartzSimplePropertyTriggerEntityTypeConfiguration(string prefix, string schema) + { + this._prefix = prefix; + this._schema = schema; + } + + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(_prefix + "SIMPROP_TRIGGERS", _schema); + + builder.HasKey(x => new { x.SchedulerName, x.TriggerName, x.TriggerGroup }); + + builder.Property(x => x.SchedulerName) + .HasColumnName("SCHED_NAME") + .HasColumnType("text") + .IsRequired(); + + builder.Property(x => x.TriggerName) + .HasColumnName("TRIGGER_NAME") + .HasColumnType("text") + .IsRequired(); + + builder.Property(x => x.TriggerGroup) + .HasColumnName("TRIGGER_GROUP") + .HasColumnType("text") + .IsRequired(); + + builder.Property(x => x.StringProperty1) + .HasColumnName("STR_PROP_1") + .HasColumnType("text"); + + builder.Property(x => x.StringProperty2) + .HasColumnName("STR_PROP_2") + .HasColumnType("text"); + + builder.Property(x => x.StringProperty3) + .HasColumnName("STR_PROP_3") + .HasColumnType("text"); + + builder.Property(x => x.IntegerProperty1) + .HasColumnName("INT_PROP_1") + .HasColumnType("integer"); + + builder.Property(x => x.IntegerProperty2) + .HasColumnName("INT_PROP_2") + .HasColumnType("integer"); + + builder.Property(x => x.LongProperty1) + .HasColumnName("LONG_PROP_1") + .HasColumnType("bigint"); + + builder.Property(x => x.LongProperty2) + .HasColumnName("LONG_PROP_2") + .HasColumnType("bigint"); + + builder.Property(x => x.DecimalProperty1) + .HasColumnName("DEC_PROP_1") + .HasColumnType("numeric"); + + builder.Property(x => x.DecimalProperty2) + .HasColumnName("DEC_PROP_2") + .HasColumnType("numeric"); + + builder.Property(x => x.BooleanProperty1) + .HasColumnName("BOOL_PROP_1") + .HasColumnType("bool"); + + builder.Property(x => x.BooleanProperty2) + .HasColumnName("BOOL_PROP_2") + .HasColumnType("bool"); + + builder.Property(x => x.TimeZoneId) + .HasColumnName("TIME_ZONE_ID") + .HasColumnType("text"); + + builder.HasOne(x => x.Trigger) + .WithMany(x => x.SimplePropertyTriggers) + .HasForeignKey(x => new { x.SchedulerName, x.TriggerName, x.TriggerGroup }) + .OnDelete(DeleteBehavior.Cascade); + } +} + diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzSimpleTriggerEntityTypeConfiguration.cs b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzSimpleTriggerEntityTypeConfiguration.cs new file mode 100644 index 0000000..6d4b7b4 --- /dev/null +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzSimpleTriggerEntityTypeConfiguration.cs @@ -0,0 +1,59 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite; + +public class QuartzSimpleTriggerEntityTypeConfiguration : IEntityTypeConfiguration +{ + private readonly string _prefix; + private readonly string _schema; + + public QuartzSimpleTriggerEntityTypeConfiguration(string prefix, string schema) + { + this._prefix = prefix; + this._schema = schema; + } + + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(_prefix + "SIMPLE_TRIGGERS", _schema); + + builder.HasKey(x => new { x.SchedulerName, x.TriggerName, x.TriggerGroup }); + + builder.Property(x => x.SchedulerName) + .HasColumnName("SCHED_NAME") + .HasColumnType("text") + .IsRequired(); + + builder.Property(x => x.TriggerName) + .HasColumnName("TRIGGER_NAME") + .HasColumnType("text") + .IsRequired(); + + builder.Property(x => x.TriggerGroup) + .HasColumnName("TRIGGER_GROUP") + .HasColumnType("text") + .IsRequired(); + + builder.Property(x => x.RepeatCount) + .HasColumnName("REPEAT_COUNT") + .HasColumnType("bigint") + .IsRequired(); + + builder.Property(x => x.RepeatInterval) + .HasColumnName("REPEAT_INTERVAL") + .HasColumnType("bigint") + .IsRequired(); + + builder.Property(x => x.TimesTriggered) + .HasColumnName("TIMES_TRIGGERED") + .HasColumnType("bigint") + .IsRequired(); + + builder.HasOne(x => x.Trigger) + .WithMany(x => x.SimpleTriggers) + .HasForeignKey(x => new { x.SchedulerName, x.TriggerName, x.TriggerGroup }) + .OnDelete(DeleteBehavior.Cascade); + } +} + diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzTriggerEntityTypeConfiguration.cs b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzTriggerEntityTypeConfiguration.cs new file mode 100644 index 0000000..dbfceab --- /dev/null +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzTriggerEntityTypeConfiguration.cs @@ -0,0 +1,110 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite; + +public class QuartzTriggerEntityTypeConfiguration : IEntityTypeConfiguration +{ + private readonly string _prefix; + private readonly string _schema; + + public QuartzTriggerEntityTypeConfiguration(string prefix, string schema) + { + this._prefix = prefix; + this._schema = schema; + } + + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable(_prefix + "TRIGGERS", _schema); + + builder.HasKey(x => new { x.SchedulerName, x.TriggerName, x.TriggerGroup }); + + builder.Property(x => x.SchedulerName) + .HasColumnName("SCHED_NAME") + .HasColumnType("text") + .IsRequired(); + + builder.Property(x => x.TriggerName) + .HasColumnName("TRIGGER_NAME") + .HasColumnType("text") + .IsRequired(); + + builder.Property(x => x.TriggerGroup) + .HasColumnName("TRIGGER_GROUP") + .HasColumnType("text") + .IsRequired(); + + builder.Property(x => x.JobName) + .HasColumnName("JOB_NAME") + .HasColumnType("text") + .IsRequired(); + + builder.Property(x => x.JobGroup) + .HasColumnName("JOB_GROUP") + .HasColumnType("text") + .IsRequired(); + + builder.Property(x => x.Description) + .HasColumnName("DESCRIPTION") + .HasColumnType("text"); + + builder.Property(x => x.NextFireTime) + .HasColumnName("NEXT_FIRE_TIME") + .HasColumnType("bigint"); + + builder.Property(x => x.PreviousFireTime) + .HasColumnName("PREV_FIRE_TIME") + .HasColumnType("bigint"); + + builder.Property(x => x.Priority) + .HasColumnName("PRIORITY") + .HasColumnType("integer"); + + builder.Property(x => x.TriggerState) + .HasColumnName("TRIGGER_STATE") + .HasColumnType("text") + .IsRequired(); + + builder.Property(x => x.TriggerType) + .HasColumnName("TRIGGER_TYPE") + .HasColumnType("text") + .IsRequired(); + + builder.Property(x => x.StartTime) + .HasColumnName("START_TIME") + .HasColumnType("bigint") + .IsRequired(); + + builder.Property(x => x.EndTime) + .HasColumnName("END_TIME") + .HasColumnType("bigint"); + + builder.Property(x => x.CalendarName) + .HasColumnName("CALENDAR_NAME") + .HasColumnType("text"); + + builder.Property(x => x.MisfireInstruction) + .HasColumnName("MISFIRE_INSTR") + .HasColumnType("smallint"); + + builder.Property(x => x.JobData) + .HasColumnName("JOB_DATA") + .HasColumnType("bytea"); + + builder.HasOne(x => x.JobDetail) + .WithMany(x => x.Triggers) + .HasForeignKey(x => new { x.SchedulerName, x.JobName, x.JobGroup }) + .IsRequired(); + + builder.HasIndex(x => x.NextFireTime) + .HasDatabaseName($"IDX_{_prefix}T_NEXT_FIRE_TIME"); + + builder.HasIndex(x => x.TriggerState) + .HasDatabaseName($"IDX_{_prefix}T_STATE"); + + builder.HasIndex(x => new { x.NextFireTime, x.TriggerState }) + .HasDatabaseName($"IDX_{_prefix}T_NFT_ST"); + } +} + diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/QuartzModelBuilderMysqlExtensions.cs b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/QuartzModelBuilderMysqlExtensions.cs new file mode 100644 index 0000000..df3b6d8 --- /dev/null +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/QuartzModelBuilderMysqlExtensions.cs @@ -0,0 +1,45 @@ +namespace AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite; + +public static class QuartzModelBuilderSQLiteExtensions +{ + public static QuartzModelBuilder UseSqlite(this QuartzModelBuilder builder, string prefix = "QRTZ_", string schema = "quartz") + { + builder.UseEntityTypeConfigurations(context => + { + context.ModelBuilder.ApplyConfiguration( + new QuartzJobDetailEntityTypeConfiguration(prefix, schema)); + + context.ModelBuilder.ApplyConfiguration( + new QuartzTriggerEntityTypeConfiguration(prefix, schema)); + + context.ModelBuilder.ApplyConfiguration( + new QuartzSimpleTriggerEntityTypeConfiguration(prefix, schema)); + + context.ModelBuilder.ApplyConfiguration( + new QuartzSimplePropertyTriggerEntityTypeConfiguration(prefix, schema)); + + context.ModelBuilder.ApplyConfiguration( + new QuartzCronTriggerEntityTypeConfiguration(prefix, schema)); + + context.ModelBuilder.ApplyConfiguration( + new QuartzBlobTriggerEntityTypeConfiguration(prefix, schema)); + + context.ModelBuilder.ApplyConfiguration( + new QuartzCalendarEntityTypeConfiguration(prefix, schema)); + + context.ModelBuilder.ApplyConfiguration( + new QuartzPausedTriggerGroupEntityTypeConfiguration(prefix, schema)); + + context.ModelBuilder.ApplyConfiguration( + new QuartzFiredTriggerEntityTypeConfiguration(prefix, schema)); + + context.ModelBuilder.ApplyConfiguration( + new QuartzSchedulerStateEntityTypeConfiguration(prefix, schema)); + + context.ModelBuilder.ApplyConfiguration( + new QuartzLockEntityTypeConfiguration(prefix, schema)); + }); + + return builder; + } +} diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SqlServer/AppAny.Quartz.EntityFrameworkCore.Migrations.SqlServer.csproj.DotSettings b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SqlServer/AppAny.Quartz.EntityFrameworkCore.Migrations.SqlServer.csproj.DotSettings new file mode 100644 index 0000000..2c3b12e --- /dev/null +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SqlServer/AppAny.Quartz.EntityFrameworkCore.Migrations.SqlServer.csproj.DotSettings @@ -0,0 +1,2 @@ + + True \ No newline at end of file diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SqlServer/QuartzModelBuilderSqlServerExtensions.cs b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SqlServer/QuartzModelBuilderSqlServerExtensions.cs index aefb1ca..5593cc1 100644 --- a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SqlServer/QuartzModelBuilderSqlServerExtensions.cs +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SqlServer/QuartzModelBuilderSqlServerExtensions.cs @@ -2,44 +2,42 @@ namespace AppAny.Quartz.EntityFrameworkCore.Migrations.SqlServer { public static class QuartzModelBuilderSqlServerExtensions { - public const string DefaultPrefix = "QRTZ_"; - - public static QuartzModelBuilder UseSqlServer(this QuartzModelBuilder builder) + public static QuartzModelBuilder UseSqlServer(this QuartzModelBuilder builder, string prefix = "QRTZ_", string schema = "quartz") { - builder.UsePrefix(DefaultPrefix).UseEntityTypeConfigurations(context => + builder.UseEntityTypeConfigurations(context => { context.ModelBuilder.ApplyConfiguration( - new QuartzJobDetailEntityTypeConfiguration(context.Prefix, context.Schema)); + new QuartzJobDetailEntityTypeConfiguration(prefix, schema)); context.ModelBuilder.ApplyConfiguration( - new QuartzTriggerEntityTypeConfiguration(context.Prefix, context.Schema)); + new QuartzTriggerEntityTypeConfiguration(prefix, schema)); context.ModelBuilder.ApplyConfiguration( - new QuartzSimpleTriggerEntityTypeConfiguration(context.Prefix, context.Schema)); + new QuartzSimpleTriggerEntityTypeConfiguration(prefix, schema)); context.ModelBuilder.ApplyConfiguration( - new QuartzSimplePropertyTriggerEntityTypeConfiguration(context.Prefix, context.Schema)); + new QuartzSimplePropertyTriggerEntityTypeConfiguration(prefix, schema)); context.ModelBuilder.ApplyConfiguration( - new QuartzCronTriggerEntityTypeConfiguration(context.Prefix, context.Schema)); + new QuartzCronTriggerEntityTypeConfiguration(prefix, schema)); context.ModelBuilder.ApplyConfiguration( - new QuartzBlobTriggerEntityTypeConfiguration(context.Prefix, context.Schema)); + new QuartzBlobTriggerEntityTypeConfiguration(prefix, schema)); context.ModelBuilder.ApplyConfiguration( - new QuartzCalendarEntityTypeConfiguration(context.Prefix, context.Schema)); + new QuartzCalendarEntityTypeConfiguration(prefix, schema)); context.ModelBuilder.ApplyConfiguration( - new QuartzPausedTriggerGroupEntityTypeConfiguration(context.Prefix, context.Schema)); + new QuartzPausedTriggerGroupEntityTypeConfiguration(prefix, schema)); context.ModelBuilder.ApplyConfiguration( - new QuartzFiredTriggerEntityTypeConfiguration(context.Prefix, context.Schema)); + new QuartzFiredTriggerEntityTypeConfiguration(prefix, schema)); context.ModelBuilder.ApplyConfiguration( - new QuartzSchedulerStateEntityTypeConfiguration(context.Prefix, context.Schema)); + new QuartzSchedulerStateEntityTypeConfiguration(prefix, schema)); context.ModelBuilder.ApplyConfiguration( - new QuartzLockEntityTypeConfiguration(context.Prefix, context.Schema)); + new QuartzLockEntityTypeConfiguration(prefix, schema)); }); return builder; diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations/AppAny.Quartz.EntityFrameworkCore.Migrations.csproj.DotSettings b/src/AppAny.Quartz.EntityFrameworkCore.Migrations/AppAny.Quartz.EntityFrameworkCore.Migrations.csproj.DotSettings new file mode 100644 index 0000000..2ba894d --- /dev/null +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations/AppAny.Quartz.EntityFrameworkCore.Migrations.csproj.DotSettings @@ -0,0 +1,2 @@ + + True \ No newline at end of file diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations/EntityTypeConfigurationContext.cs b/src/AppAny.Quartz.EntityFrameworkCore.Migrations/EntityTypeConfigurationContext.cs index 3c605e7..afd7704 100644 --- a/src/AppAny.Quartz.EntityFrameworkCore.Migrations/EntityTypeConfigurationContext.cs +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations/EntityTypeConfigurationContext.cs @@ -4,15 +4,11 @@ namespace AppAny.Quartz.EntityFrameworkCore.Migrations { public readonly struct EntityTypeConfigurationContext { - public EntityTypeConfigurationContext(string? prefix, string? schema, ModelBuilder modelBuilder) + public EntityTypeConfigurationContext(ModelBuilder modelBuilder) { - Prefix = prefix; - Schema = schema; ModelBuilder = modelBuilder; } - public string? Prefix { get; } - public string? Schema { get; } public ModelBuilder ModelBuilder { get; } } } diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations/ModelBuilderExtensions.cs b/src/AppAny.Quartz.EntityFrameworkCore.Migrations/ModelBuilderExtensions.cs index d3d7f19..df90c7b 100644 --- a/src/AppAny.Quartz.EntityFrameworkCore.Migrations/ModelBuilderExtensions.cs +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations/ModelBuilderExtensions.cs @@ -17,8 +17,7 @@ public static ModelBuilder AddQuartz( throw new InvalidOperationException("No database provider"); } - model.EntityTypeConfigurations.Invoke( - new EntityTypeConfigurationContext(model.Prefix, model.Schema, modelBuilder)); + model.EntityTypeConfigurations.Invoke(new EntityTypeConfigurationContext(modelBuilder)); return modelBuilder; } diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations/QuartzModelBuilder.cs b/src/AppAny.Quartz.EntityFrameworkCore.Migrations/QuartzModelBuilder.cs index daef02e..e7791a6 100644 --- a/src/AppAny.Quartz.EntityFrameworkCore.Migrations/QuartzModelBuilder.cs +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations/QuartzModelBuilder.cs @@ -4,9 +4,6 @@ namespace AppAny.Quartz.EntityFrameworkCore.Migrations { public interface QuartzModelBuilder { - QuartzModelBuilder UsePrefix(string? prefix); - QuartzModelBuilder UseSchema(string? schema); - QuartzModelBuilder UseEntityTypeConfigurations(Action entityTypeConfigurations); } @@ -19,20 +16,6 @@ public DefaultQuartzModelBuilder(QuartzModel model) this.model = model; } - public QuartzModelBuilder UsePrefix(string? prefix) - { - model.Prefix = prefix; - - return this; - } - - public QuartzModelBuilder UseSchema(string? schema) - { - model.Schema = schema; - - return this; - } - public QuartzModelBuilder UseEntityTypeConfigurations( Action entityTypeConfigurations) { diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations/QuartzModelBuilderExtensions.cs b/src/AppAny.Quartz.EntityFrameworkCore.Migrations/QuartzModelBuilderExtensions.cs deleted file mode 100644 index 685ec2f..0000000 --- a/src/AppAny.Quartz.EntityFrameworkCore.Migrations/QuartzModelBuilderExtensions.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace AppAny.Quartz.EntityFrameworkCore.Migrations -{ - public static class QuartzModelBuilderExtensions - { - public static QuartzModelBuilder UseNoPrefix(this QuartzModelBuilder builder) - { - return builder.UsePrefix(null); - } - - public static QuartzModelBuilder UseNoSchema(this QuartzModelBuilder builder) - { - return builder.UseSchema(null); - } - } -} diff --git a/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests.csproj b/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests.csproj index 43857bc..a49d82c 100644 --- a/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests.csproj +++ b/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests.csproj @@ -9,6 +9,7 @@ + @@ -21,6 +22,8 @@ + + all diff --git a/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/TestSetup.cs b/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/Base/ConnectionStrings.cs similarity index 80% rename from tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/TestSetup.cs rename to tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/Base/ConnectionStrings.cs index c5de706..1ef8175 100644 --- a/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/TestSetup.cs +++ b/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/Base/ConnectionStrings.cs @@ -1,6 +1,6 @@ -namespace AppAny.Quartz.EntityFrameworkCore.Migrations.Tests +namespace AppAny.Quartz.EntityFrameworkCore.Migrations.Tests.Base { - public static class TestSetup + public static class ConnectionStrings { public const string PostgreSqlConnectionString = "host=localhost; port=5432; db=test; uid=test; pwd=test;"; public const string MySqlConnectionString = "server=localhost; port=33306; database=test; uid=test; pwd=test;"; diff --git a/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/MySQL/MySqlIntegrationDbContext.cs b/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/MySQL/MySqlIntegrationDbContext.cs new file mode 100644 index 0000000..9eef911 --- /dev/null +++ b/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/MySQL/MySqlIntegrationDbContext.cs @@ -0,0 +1,18 @@ +using AppAny.Quartz.EntityFrameworkCore.Migrations.MySql; +using Microsoft.EntityFrameworkCore; + +namespace AppAny.Quartz.EntityFrameworkCore.Migrations.Tests.MySQL +{ + public class MySqlIntegrationDbContext : DbContext + { + public MySqlIntegrationDbContext(DbContextOptions options) + : base(options) + { + } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.AddQuartz(builder => builder.UseMySql()); + } + } +} diff --git a/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/MySqlintegrationDbContext.cs b/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/MySqlintegrationDbContext.cs deleted file mode 100644 index 6e221ea..0000000 --- a/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/MySqlintegrationDbContext.cs +++ /dev/null @@ -1,20 +0,0 @@ -using AppAny.Quartz.EntityFrameworkCore.Migrations.MySql; -using Microsoft.EntityFrameworkCore; - -namespace AppAny.Quartz.EntityFrameworkCore.Migrations.Tests -{ - public class MySqlintegrationDbContext : DbContext - { - public MySqlintegrationDbContext(DbContextOptions options) - : base(options) - { - } - - protected override void OnModelCreating(ModelBuilder modelBuilder) - { - modelBuilder.AddQuartz(builder => builder - .UseMySql() - .UseNoSchema()); - } - } -} diff --git a/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/IntegrationDbContextDesignTimeFactory.cs b/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/PostgreSQL/IntegrationDbContextDesignTimeFactory.cs similarity index 65% rename from tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/IntegrationDbContextDesignTimeFactory.cs rename to tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/PostgreSQL/IntegrationDbContextDesignTimeFactory.cs index 79bc31c..58ce385 100644 --- a/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/IntegrationDbContextDesignTimeFactory.cs +++ b/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/PostgreSQL/IntegrationDbContextDesignTimeFactory.cs @@ -1,13 +1,14 @@ +using AppAny.Quartz.EntityFrameworkCore.Migrations.Tests.Base; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Design; -namespace AppAny.Quartz.EntityFrameworkCore.Migrations.Tests +namespace AppAny.Quartz.EntityFrameworkCore.Migrations.Tests.PostgreSQL { public class IntegrationDbContextDesignTimeFactory : IDesignTimeDbContextFactory { public PostgreSqlIntegrationDbContext CreateDbContext(string[] args) { - var options = new DbContextOptionsBuilder().UseNpgsql(TestSetup.PostgreSqlConnectionString).Options; + var options = new DbContextOptionsBuilder().UseNpgsql(ConnectionStrings.PostgreSqlConnectionString).Options; return new PostgreSqlIntegrationDbContext(options); } diff --git a/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/PostgreSQLIntegrationDbContext.cs b/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/PostgreSQL/PostgreSQLIntegrationDbContext.cs similarity index 67% rename from tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/PostgreSQLIntegrationDbContext.cs rename to tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/PostgreSQL/PostgreSQLIntegrationDbContext.cs index 351d1e4..28bef40 100644 --- a/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/PostgreSQLIntegrationDbContext.cs +++ b/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/PostgreSQL/PostgreSQLIntegrationDbContext.cs @@ -1,7 +1,7 @@ using AppAny.Quartz.EntityFrameworkCore.Migrations.PostgreSQL; using Microsoft.EntityFrameworkCore; -namespace AppAny.Quartz.EntityFrameworkCore.Migrations.Tests +namespace AppAny.Quartz.EntityFrameworkCore.Migrations.Tests.PostgreSQL { public class PostgreSqlIntegrationDbContext : DbContext { @@ -12,10 +12,7 @@ public PostgreSqlIntegrationDbContext(DbContextOptions builder - .UsePostgreSql() - .UseSchema("quartz") - .UseNoPrefix()); + modelBuilder.AddQuartz(builder => builder.UsePostgreSql()); } } } diff --git a/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/IntegrationTests.cs b/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/PostgreSQL/PostgreSQL_IntegrationTests.cs similarity index 62% rename from tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/IntegrationTests.cs rename to tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/PostgreSQL/PostgreSQL_IntegrationTests.cs index 4c5ae5d..ada4f37 100644 --- a/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/IntegrationTests.cs +++ b/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/PostgreSQL/PostgreSQL_IntegrationTests.cs @@ -1,8 +1,11 @@ using System; -using Xunit; +using AppAny.Quartz.EntityFrameworkCore.Migrations.Tests.Base; +using AppAny.Quartz.EntityFrameworkCore.Migrations.Tests.MySQL; +using AppAny.Quartz.EntityFrameworkCore.Migrations.Tests.SQLServer; using Microsoft.EntityFrameworkCore; +using Xunit; -namespace AppAny.Quartz.EntityFrameworkCore.Migrations.Tests +namespace AppAny.Quartz.EntityFrameworkCore.Migrations.Tests.PostgreSQL { public class IntegrationTests { @@ -10,7 +13,7 @@ public class IntegrationTests public void PostgreSQL_CompleteMigration() { var options = new DbContextOptionsBuilder() - .UseNpgsql(TestSetup.PostgreSqlConnectionString) + .UseNpgsql(ConnectionStrings.PostgreSqlConnectionString) .EnableSensitiveDataLogging() .LogTo(Console.WriteLine) .Options; @@ -24,13 +27,13 @@ public void PostgreSQL_CompleteMigration() [Fact] public void MySQL_CompleteMigration() { - var options = new DbContextOptionsBuilder() - .UseMySql(TestSetup.MySqlConnectionString, ServerVersion.AutoDetect(TestSetup.MySqlConnectionString)) + var options = new DbContextOptionsBuilder() + .UseMySql(ConnectionStrings.MySqlConnectionString, ServerVersion.AutoDetect(ConnectionStrings.MySqlConnectionString)) .EnableSensitiveDataLogging() .LogTo(Console.WriteLine) .Options; - using (var dbContext = new MySqlintegrationDbContext(options)) + using (var dbContext = new MySqlIntegrationDbContext(options)) { dbContext.Database.Migrate(); } @@ -40,7 +43,7 @@ public void MySQL_CompleteMigration() public void SqlServer_CompleteMigration() { var options = new DbContextOptionsBuilder() - .UseSqlServer(TestSetup.SqlServerConnectionString) + .UseSqlServer(ConnectionStrings.SqlServerConnectionString) .EnableSensitiveDataLogging() .LogTo(Console.WriteLine) .Options; diff --git a/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/SqlServerIntegrationDbContext.cs b/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/SQLServer/SqlServerIntegrationDbContext.cs similarity index 70% rename from tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/SqlServerIntegrationDbContext.cs rename to tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/SQLServer/SqlServerIntegrationDbContext.cs index c52c84a..368ae08 100644 --- a/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/SqlServerIntegrationDbContext.cs +++ b/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/SQLServer/SqlServerIntegrationDbContext.cs @@ -1,7 +1,7 @@ using AppAny.Quartz.EntityFrameworkCore.Migrations.SqlServer; using Microsoft.EntityFrameworkCore; -namespace AppAny.Quartz.EntityFrameworkCore.Migrations.Tests +namespace AppAny.Quartz.EntityFrameworkCore.Migrations.Tests.SQLServer { public class SqlServerIntegrationDbContext : DbContext { @@ -12,9 +12,7 @@ public SqlServerIntegrationDbContext(DbContextOptions builder - .UseSqlServer() - .UseNoSchema()); + modelBuilder.AddQuartz(builder => builder.UseSqlServer()); } } } diff --git a/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/SQLite/SQLiteIntegrationDbContext.cs b/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/SQLite/SQLiteIntegrationDbContext.cs new file mode 100644 index 0000000..eb724aa --- /dev/null +++ b/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/SQLite/SQLiteIntegrationDbContext.cs @@ -0,0 +1,18 @@ +using AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite; +using Microsoft.EntityFrameworkCore; + +namespace AppAny.Quartz.EntityFrameworkCore.Migrations.Tests.SQLite +{ + public class SQLiteIntegrationDbContext : DbContext + { + public SQLiteIntegrationDbContext(DbContextOptions options) + : base(options) + { + } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.AddQuartz(builder => builder.UseSqlite()); + } + } +} diff --git a/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/SQLite/SQLite_IntegrationTests.cs b/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/SQLite/SQLite_IntegrationTests.cs new file mode 100644 index 0000000..75a40c1 --- /dev/null +++ b/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/SQLite/SQLite_IntegrationTests.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Specialized; +using System.Threading.Tasks; +using Microsoft.Data.Sqlite; +using Microsoft.EntityFrameworkCore; +using Quartz; +using Xunit; + +namespace AppAny.Quartz.EntityFrameworkCore.Migrations.Tests.SQLite; + +public class SQLiteIntegrationDbContext_IntegrationTests : IDisposable +{ + private readonly SQLiteIntegrationDbContext _dbContext; + private readonly string _connectionString; + + public SQLiteIntegrationDbContext_IntegrationTests() + { + // Database is created in [Root]/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/bin/Debug/net6.0/ + _connectionString = new SqliteConnectionStringBuilder() + { + Mode = SqliteOpenMode.ReadWriteCreate, + ForeignKeys = true, + DataSource = "sqlite_test.db", + Cache = SqliteCacheMode.Shared, + }.ToString(); + + var options = new DbContextOptionsBuilder().UseSqlite(_connectionString).Options; + _dbContext = new SQLiteIntegrationDbContext(options); + } + + [Fact] + public void ShouldCompleteDatabaseMigrate_WhenDatabaseIsSQLite() + { + var exception = Record.Exception(() => _dbContext.Database.Migrate()); + + Assert.Null(exception); + } + + [Fact] + public async Task ShouldBuildScheduler_WhenDataStoreIsSQLite() + { + // EnsureCreated is used here as Quartz does the SchemaValidation on scheduler creation + var exception = Record.Exception(() => _dbContext.Database.EnsureCreated()); + Assert.Null(exception); + + // Create a Quartz scheduler with the above DBContext as the JobStore + var scheduler = await SchedulerBuilder.Create() + .UseDefaultThreadPool(x => x.MaxConcurrency = 5) + .UsePersistentStore(x => + { + x.PerformSchemaValidation = true; + x.UseMicrosoftSQLite(_connectionString); + x.UseJsonSerializer(); + }) + .BuildScheduler(); + + // Start Scheduler, ensure no SQLite schema validation exceptions are thrown + exception = await Record.ExceptionAsync(async () => await scheduler.Start()); + Assert.Null(exception); + + Assert.True(scheduler.IsStarted); + + await scheduler.Shutdown(); + Assert.True(scheduler.IsShutdown); + } + + public void Dispose() + { + _dbContext.Database.EnsureDeleted(); + _dbContext.Dispose(); + } +}