From babd2e5737022e867b2f28ff46485771db6218e1 Mon Sep 17 00:00:00 2001 From: JasonLandbridge Date: Thu, 2 Apr 2026 15:11:02 +0200 Subject: [PATCH] feat(quartz): add misfire original fire time column mapping --- .../QuartzTriggerEntityTypeConfiguration.cs | 4 +++ .../QuartzTriggerEntityTypeConfiguration.cs | 4 +++ .../QuartzTriggerEntityTypeConfiguration.cs | 4 +++ .../QuartzTriggerEntityTypeConfiguration.cs | 4 +++ .../Quartz/QuartzTrigger.cs | 1 + .../QuartzTriggerModelMappingTests.cs | 30 ++++++++++++++++ .../QuartzTriggerModelMappingTests.cs | 28 +++++++++++++++ .../QuartzTriggerModelMappingTests.cs | 35 +++++++++++++++++++ .../QuartzTriggerModelMappingTests.cs | 28 +++++++++++++++ 9 files changed, 138 insertions(+) create mode 100644 tests/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql.Tests/QuartzTriggerModelMappingTests.cs create mode 100644 tests/AppAny.Quartz.EntityFrameworkCore.Migrations.PostgreSQL.Tests/QuartzTriggerModelMappingTests.cs create mode 100644 tests/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite.Tests/QuartzTriggerModelMappingTests.cs create mode 100644 tests/AppAny.Quartz.EntityFrameworkCore.Migrations.SqlServer.Tests/QuartzTriggerModelMappingTests.cs diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzTriggerEntityTypeConfiguration.cs b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzTriggerEntityTypeConfiguration.cs index 3f07616..a01aa57 100644 --- a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzTriggerEntityTypeConfiguration.cs +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql/EntityTypeConfigurations/QuartzTriggerEntityTypeConfiguration.cs @@ -78,6 +78,10 @@ public void Configure(EntityTypeBuilder builder) .HasColumnName("END_TIME") .HasColumnType("bigint(19)"); + builder.Property(x => x.MisfireOriginalFireTime) + .HasColumnName("MISFIRE_ORIG_FIRE_TIME") + .HasColumnType("bigint(19)"); + builder.Property(x => x.CalendarName) .HasColumnName("CALENDAR_NAME") .HasColumnType("varchar(200)"); diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.PostgreSQL/EntityTypeConfigurations/QuartzTriggerEntityTypeConfiguration.cs b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.PostgreSQL/EntityTypeConfigurations/QuartzTriggerEntityTypeConfiguration.cs index a692d93..8217e2a 100644 --- a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.PostgreSQL/EntityTypeConfigurations/QuartzTriggerEntityTypeConfiguration.cs +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.PostgreSQL/EntityTypeConfigurations/QuartzTriggerEntityTypeConfiguration.cs @@ -80,6 +80,10 @@ public void Configure(EntityTypeBuilder builder) .HasColumnName("end_time") .HasColumnType("bigint"); + builder.Property(x => x.MisfireOriginalFireTime) + .HasColumnName("misfire_orig_fire_time") + .HasColumnType("bigint"); + builder.Property(x => x.CalendarName) .HasColumnName("calendar_name") .HasColumnType("text"); diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzTriggerEntityTypeConfiguration.cs b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzTriggerEntityTypeConfiguration.cs index d143dba..db5ea50 100644 --- a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzTriggerEntityTypeConfiguration.cs +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite/EntityTypeConfigurations/QuartzTriggerEntityTypeConfiguration.cs @@ -78,6 +78,10 @@ public void Configure(EntityTypeBuilder builder) .HasColumnName("END_TIME") .HasColumnType("bigint"); + builder.Property(x => x.MisfireOriginalFireTime) + .HasColumnName("MISFIRE_ORIG_FIRE_TIME") + .HasColumnType("bigint"); + builder.Property(x => x.CalendarName) .HasColumnName("CALENDAR_NAME") .HasColumnType("text"); diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SqlServer/EntityTypeConfigurations/QuartzTriggerEntityTypeConfiguration.cs b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SqlServer/EntityTypeConfigurations/QuartzTriggerEntityTypeConfiguration.cs index 5ed8765..8ea49a5 100644 --- a/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SqlServer/EntityTypeConfigurations/QuartzTriggerEntityTypeConfiguration.cs +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations.SqlServer/EntityTypeConfigurations/QuartzTriggerEntityTypeConfiguration.cs @@ -84,6 +84,10 @@ public void Configure(EntityTypeBuilder builder) .HasColumnName("END_TIME") .HasColumnType("bigint"); + builder.Property(x => x.MisfireOriginalFireTime) + .HasColumnName("MISFIRE_ORIG_FIRE_TIME") + .HasColumnType("bigint"); + builder.Property(x => x.CalendarName) .HasColumnName("CALENDAR_NAME") .HasMaxLength(200) diff --git a/src/AppAny.Quartz.EntityFrameworkCore.Migrations/Quartz/QuartzTrigger.cs b/src/AppAny.Quartz.EntityFrameworkCore.Migrations/Quartz/QuartzTrigger.cs index 4561c3f..62f2b7e 100644 --- a/src/AppAny.Quartz.EntityFrameworkCore.Migrations/Quartz/QuartzTrigger.cs +++ b/src/AppAny.Quartz.EntityFrameworkCore.Migrations/Quartz/QuartzTrigger.cs @@ -17,6 +17,7 @@ public class QuartzTrigger public string TriggerType { get; set; } = null!; public long StartTime { get; set; } public long? EndTime { get; set; } + public long? MisfireOriginalFireTime { get; set; } public string? CalendarName { get; set; } = null!; public short? MisfireInstruction { get; set; } public byte[]? JobData { get; set; } diff --git a/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql.Tests/QuartzTriggerModelMappingTests.cs b/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql.Tests/QuartzTriggerModelMappingTests.cs new file mode 100644 index 0000000..56d0205 --- /dev/null +++ b/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.MySql.Tests/QuartzTriggerModelMappingTests.cs @@ -0,0 +1,30 @@ +namespace AppAny.Quartz.EntityFrameworkCore.Migrations.MySql.Tests; + +using AppAny.Quartz.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata; + +public class QuartzTriggerModelMappingTests +{ + [Fact] + public void ShouldMapMisfireOriginalFireTimeColumn() + { + var options = new DbContextOptionsBuilder() + .UseMySql( + "Server=localhost;Port=3306;Database=quartz_mapping_tests;User=root;Password=password", + ServerVersion.Parse("8.0.36-mysql")) + .Options; + + using var dbContext = new MySqlIntegrationDbContext(options); + var entityType = dbContext.Model.FindEntityType(typeof(QuartzTrigger)); + + Assert.NotNull(entityType); + + var property = entityType!.FindProperty(nameof(QuartzTrigger.MisfireOriginalFireTime)); + Assert.NotNull(property); + + var table = StoreObjectIdentifier.Table(entityType.GetTableName()!, entityType.GetSchema()); + Assert.Equal("MISFIRE_ORIG_FIRE_TIME", property!.GetColumnName(table)); + Assert.Equal("bigint(19)", property.GetColumnType()); + } +} diff --git a/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.PostgreSQL.Tests/QuartzTriggerModelMappingTests.cs b/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.PostgreSQL.Tests/QuartzTriggerModelMappingTests.cs new file mode 100644 index 0000000..9cc2778 --- /dev/null +++ b/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.PostgreSQL.Tests/QuartzTriggerModelMappingTests.cs @@ -0,0 +1,28 @@ +namespace AppAny.Quartz.EntityFrameworkCore.Migrations.PostgreSQL.Tests; + +using AppAny.Quartz.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata; + +public class QuartzTriggerModelMappingTests +{ + [Fact] + public void ShouldMapMisfireOriginalFireTimeColumn() + { + var options = new DbContextOptionsBuilder() + .UseNpgsql("Host=localhost;Port=5432;Database=quartz_mapping_tests;Username=postgres;Password=postgres") + .Options; + + using var dbContext = new PostgreSqlIntegrationDbContext(options); + var entityType = dbContext.Model.FindEntityType(typeof(QuartzTrigger)); + + Assert.NotNull(entityType); + + var property = entityType!.FindProperty(nameof(QuartzTrigger.MisfireOriginalFireTime)); + Assert.NotNull(property); + + var table = StoreObjectIdentifier.Table(entityType.GetTableName()!, entityType.GetSchema()); + Assert.Equal("misfire_orig_fire_time", property!.GetColumnName(table)); + Assert.Equal("bigint", property.GetColumnType()); + } +} diff --git a/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite.Tests/QuartzTriggerModelMappingTests.cs b/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite.Tests/QuartzTriggerModelMappingTests.cs new file mode 100644 index 0000000..18c421f --- /dev/null +++ b/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite.Tests/QuartzTriggerModelMappingTests.cs @@ -0,0 +1,35 @@ +namespace AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite.Tests; + +using AppAny.Quartz.EntityFrameworkCore.Migrations; +using Microsoft.Data.Sqlite; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata; + +public class QuartzTriggerModelMappingTests +{ + [Fact] + public void ShouldMapMisfireOriginalFireTimeColumn() + { + var connectionString = new SqliteConnectionStringBuilder + { + Mode = SqliteOpenMode.Memory, + DataSource = ":memory:" + }.ToString(); + + var options = new DbContextOptionsBuilder() + .UseSqlite(connectionString) + .Options; + + using var dbContext = new SQLiteIntegrationDbContext(options); + var entityType = dbContext.Model.FindEntityType(typeof(QuartzTrigger)); + + Assert.NotNull(entityType); + + var property = entityType!.FindProperty(nameof(QuartzTrigger.MisfireOriginalFireTime)); + Assert.NotNull(property); + + var table = StoreObjectIdentifier.Table(entityType.GetTableName()!, entityType.GetSchema()); + Assert.Equal("MISFIRE_ORIG_FIRE_TIME", property!.GetColumnName(table)); + Assert.Equal("bigint", property.GetColumnType()); + } +} diff --git a/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.SqlServer.Tests/QuartzTriggerModelMappingTests.cs b/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.SqlServer.Tests/QuartzTriggerModelMappingTests.cs new file mode 100644 index 0000000..8035913 --- /dev/null +++ b/tests/AppAny.Quartz.EntityFrameworkCore.Migrations.SqlServer.Tests/QuartzTriggerModelMappingTests.cs @@ -0,0 +1,28 @@ +namespace AppAny.Quartz.EntityFrameworkCore.Migrations.SqlServer.Tests; + +using AppAny.Quartz.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata; + +public class QuartzTriggerModelMappingTests +{ + [Fact] + public void ShouldMapMisfireOriginalFireTimeColumn() + { + var options = new DbContextOptionsBuilder() + .UseSqlServer("Server=(localdb)\\mssqllocaldb;Database=QuartzMappingTests;Trusted_Connection=True;") + .Options; + + using var dbContext = new SqlServerIntegrationDbContext(options); + var entityType = dbContext.Model.FindEntityType(typeof(QuartzTrigger)); + + Assert.NotNull(entityType); + + var property = entityType!.FindProperty(nameof(QuartzTrigger.MisfireOriginalFireTime)); + Assert.NotNull(property); + + var table = StoreObjectIdentifier.Table(entityType.GetTableName()!, entityType.GetSchema()); + Assert.Equal("MISFIRE_ORIG_FIRE_TIME", property!.GetColumnName(table)); + Assert.Equal("bigint", property.GetColumnType()); + } +}