< Summary

Information
Class: Elsa.Persistence.EFCore.Modules.Runtime.Configurations
Assembly: Elsa.Persistence.EFCore
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Persistence.EFCore/Modules/Runtime/Configurations.cs
Line coverage
100%
Covered lines: 152
Uncovered lines: 0
Coverable lines: 152
Total lines: 205
Line coverage: 100%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
Configure(...)100%11100%
Configure(...)100%11100%
Configure(...)100%11100%
Configure(...)100%11100%
Configure(...)100%11100%
Configure(...)100%11100%
Configure(...)100%11100%
Configure(...)100%11100%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Persistence.EFCore/Modules/Runtime/Configurations.cs

#LineLine coverage
 1using Elsa.KeyValues.Entities;
 2using Elsa.Workflows.Runtime.Entities;
 3using Microsoft.EntityFrameworkCore;
 4using Microsoft.EntityFrameworkCore.Metadata.Builders;
 5
 6namespace Elsa.Persistence.EFCore.Modules.Runtime;
 7
 8/// <summary>
 9/// EF Core configuration for various sets of <see cref="DbContext"/>.
 10/// </summary>
 11public class Configurations :
 12    IEntityTypeConfiguration<StoredTrigger>,
 13    IEntityTypeConfiguration<WorkflowExecutionLogRecord>,
 14    IEntityTypeConfiguration<ActivityExecutionRecord>,
 15    IEntityTypeConfiguration<StoredBookmark>,
 16    IEntityTypeConfiguration<BookmarkQueueItem>,
 17    IEntityTypeConfiguration<BookmarkQueueDeadLetterItem>,
 18    IEntityTypeConfiguration<SerializedKeyValuePair>,
 19    IEntityTypeConfiguration<WorkflowInboxMessage>
 20{
 21    /// <inheritdoc />
 22    public void Configure(EntityTypeBuilder<ActivityExecutionRecord> builder)
 23    {
 524        builder.Ignore(x => x.ActivityState);
 525        builder.Ignore(x => x.Exception);
 526        builder.Ignore(x => x.Payload);
 527        builder.Ignore(x => x.Outputs);
 528        builder.Ignore(x => x.Metadata);
 529        builder.Ignore(x => x.Properties);
 530        builder.Property<string>("SerializedActivityState");
 531        builder.Property<string>("SerializedActivityStateCompressionAlgorithm");
 532        builder.Property<string>("SerializedException");
 533        builder.Property<string>("SerializedPayload");
 534        builder.Property<string>("SerializedOutputs");
 535        builder.Property<string>("SerializedProperties");
 536        builder.Property<string>("SerializedMetadata");
 537        builder.Property(x => x.Status).HasConversion<string>();
 538        builder.HasIndex(x => x.WorkflowInstanceId).HasDatabaseName($"IX_{nameof(ActivityExecutionRecord)}_{nameof(Activ
 539        builder.HasIndex(x => x.ActivityId).HasDatabaseName($"IX_{nameof(ActivityExecutionRecord)}_{nameof(ActivityExecu
 540        builder.HasIndex(x => x.ActivityType).HasDatabaseName($"IX_{nameof(ActivityExecutionRecord)}_{nameof(ActivityExe
 541        builder.HasIndex(x => x.ActivityTypeVersion).HasDatabaseName($"IX_{nameof(ActivityExecutionRecord)}_{nameof(Acti
 542        builder.HasIndex(x => new
 543        {
 544            x.ActivityType,
 545            x.ActivityTypeVersion
 546        }).HasDatabaseName($"IX_{nameof(ActivityExecutionRecord)}_{nameof(ActivityExecutionRecord.ActivityType)}_{nameof
 547        builder.HasIndex(x => x.ActivityName).HasDatabaseName($"IX_{nameof(ActivityExecutionRecord)}_{nameof(ActivityExe
 548        builder.HasIndex(x => x.StartedAt).HasDatabaseName($"IX_{nameof(ActivityExecutionRecord)}_{nameof(ActivityExecut
 549        builder.HasIndex(x => x.HasBookmarks).HasDatabaseName($"IX_{nameof(ActivityExecutionRecord)}_{nameof(ActivityExe
 550        builder.HasIndex(x => x.Status).HasDatabaseName($"IX_{nameof(ActivityExecutionRecord)}_{nameof(ActivityExecution
 551        builder.HasIndex(x => x.CompletedAt).HasDatabaseName($"IX_{nameof(ActivityExecutionRecord)}_{nameof(ActivityExec
 552        builder.HasIndex(x => x.TenantId).HasDatabaseName($"IX_{nameof(ActivityExecutionRecord)}_{nameof(ActivityExecuti
 553        builder.HasIndex(x => x.SchedulingActivityExecutionId).HasDatabaseName($"IX_{nameof(ActivityExecutionRecord)}_{n
 554        builder.HasIndex(x => x.SchedulingActivityId).HasDatabaseName($"IX_{nameof(ActivityExecutionRecord)}_{nameof(Act
 555        builder.HasIndex(x => x.SchedulingWorkflowInstanceId).HasDatabaseName($"IX_{nameof(ActivityExecutionRecord)}_{na
 556    }
 57
 58    public void Configure(EntityTypeBuilder<BookmarkQueueItem> builder)
 59    {
 560        builder.Ignore(x => x.Options);
 561        builder.Property<string>("SerializedOptions");
 562        builder.HasIndex(x => x.StimulusHash, $"IX_{nameof(BookmarkQueueItem)}_{nameof(BookmarkQueueItem.StimulusHash)}"
 563        builder.HasIndex(x => x.WorkflowInstanceId, $"IX_{nameof(BookmarkQueueItem)}_{nameof(BookmarkQueueItem.WorkflowI
 564        builder.HasIndex(x => x.CorrelationId, $"IX_{nameof(BookmarkQueueItem)}_{nameof(BookmarkQueueItem.CorrelationId)
 565        builder.HasIndex(x => x.BookmarkId, $"IX_{nameof(BookmarkQueueItem)}_{nameof(BookmarkQueueItem.BookmarkId)}");
 566        builder.HasIndex(x => x.ActivityInstanceId, $"IX_{nameof(BookmarkQueueItem)}_{nameof(BookmarkQueueItem.ActivityI
 567        builder.HasIndex(x => x.ActivityTypeName, $"IX_{nameof(BookmarkQueueItem)}_{nameof(BookmarkQueueItem.ActivityTyp
 568        builder.HasIndex(x => x.CreatedAt, $"IX_{nameof(BookmarkQueueItem)}_{nameof(BookmarkQueueItem.CreatedAt)}");
 569        builder.HasIndex(x => x.TenantId, $"IX_{nameof(BookmarkQueueItem)}_{nameof(BookmarkQueueItem.TenantId)}");
 570    }
 71
 72    /// <inheritdoc />
 73    public void Configure(EntityTypeBuilder<BookmarkQueueDeadLetterItem> builder)
 74    {
 575        builder.Ignore(x => x.Options);
 576        builder.Property<string>("SerializedOptions");
 577        builder.HasIndex(x => x.OriginalQueueItemId, $"IX_{nameof(BookmarkQueueDeadLetterItem)}_{nameof(BookmarkQueueDea
 578        builder.HasIndex(x => x.WorkflowInstanceId, $"IX_{nameof(BookmarkQueueDeadLetterItem)}_{nameof(BookmarkQueueDead
 579        builder.HasIndex(x => x.CorrelationId, $"IX_{nameof(BookmarkQueueDeadLetterItem)}_{nameof(BookmarkQueueDeadLette
 580        builder.HasIndex(x => x.BookmarkId, $"IX_{nameof(BookmarkQueueDeadLetterItem)}_{nameof(BookmarkQueueDeadLetterIt
 581        builder.HasIndex(x => x.ActivityInstanceId, $"IX_{nameof(BookmarkQueueDeadLetterItem)}_{nameof(BookmarkQueueDead
 582        builder.HasIndex(x => x.ActivityTypeName, $"IX_{nameof(BookmarkQueueDeadLetterItem)}_{nameof(BookmarkQueueDeadLe
 583        builder.HasIndex(x => x.DeadLetteredAt, $"IX_{nameof(BookmarkQueueDeadLetterItem)}_{nameof(BookmarkQueueDeadLett
 584        builder.HasIndex(x => x.TenantId, $"IX_{nameof(BookmarkQueueDeadLetterItem)}_{nameof(BookmarkQueueDeadLetterItem
 585    }
 86
 87    /// <inheritdoc />
 88    public void Configure(EntityTypeBuilder<SerializedKeyValuePair> builder)
 89    {
 590        builder.HasKey(x => x.Id);
 591        builder.Ignore(x => x.Key);
 592        builder.HasIndex(x => x.TenantId, $"IX_{nameof(SerializedKeyValuePair)}_{nameof(SerializedKeyValuePair.TenantId)
 593    }
 94
 95    /// <inheritdoc />
 96    public void Configure(EntityTypeBuilder<StoredBookmark> builder)
 97    {
 598        builder.Ignore(x => x.Payload);
 599        builder.Ignore(x => x.Metadata);
 5100        builder.HasKey(b => b.Id);
 5101        builder.Property<string>("SerializedPayload");
 5102        builder.Property<string>("SerializedMetadata");
 5103        builder.HasIndex(x => x.ActivityTypeName, $"IX_{nameof(StoredBookmark)}_{nameof(StoredBookmark.ActivityTypeName)
 5104        builder.HasIndex(x => x.Name, $"IX_{nameof(StoredBookmark)}_{nameof(StoredBookmark.Name)}");
 5105        builder.HasIndex(x => x.Hash, $"IX_{nameof(StoredBookmark)}_{nameof(StoredBookmark.Hash)}");
 5106        builder.HasIndex(x => x.WorkflowInstanceId, $"IX_{nameof(StoredBookmark)}_{nameof(StoredBookmark.WorkflowInstanc
 5107        builder.HasIndex(x => x.ActivityInstanceId, $"IX_{nameof(StoredBookmark)}_{nameof(StoredBookmark.ActivityInstanc
 5108        builder.HasIndex(x => x.CreatedAt, $"IX_{nameof(StoredBookmark)}_{nameof(StoredBookmark.CreatedAt)}");
 5109        builder.HasIndex(x => new
 5110            {
 5111                x.ActivityTypeName,
 5112                x.Hash
 5113            }, $"IX_{nameof(StoredBookmark)}_{nameof(StoredBookmark.ActivityTypeName)}_{nameof(StoredBookmark.Hash)}");
 5114        builder.HasIndex(x => new
 5115            {
 5116                x.ActivityTypeName,
 5117                x.Hash,
 5118                x.WorkflowInstanceId
 5119            }, $"IX_{nameof(StoredBookmark)}_{nameof(StoredBookmark.ActivityTypeName)}_{nameof(StoredBookmark.Hash)}_{na
 5120        builder.HasIndex(x => new
 5121            {
 5122                ActivityTypeName = x.Name,
 5123                x.Hash
 5124            }, $"IX_{nameof(StoredBookmark)}_{nameof(StoredBookmark.Name)}_{nameof(StoredBookmark.Hash)}");
 5125        builder.HasIndex(x => new
 5126            {
 5127                ActivityTypeName = x.Name,
 5128                x.Hash,
 5129                x.WorkflowInstanceId
 5130            }, $"IX_{nameof(StoredBookmark)}_{nameof(StoredBookmark.Name)}_{nameof(StoredBookmark.Hash)}_{nameof(StoredB
 5131        builder.HasIndex(x => x.TenantId, $"IX_{nameof(StoredBookmark)}_{nameof(StoredBookmark.TenantId)}");
 5132    }
 133
 134    /// <inheritdoc />
 135    public void Configure(EntityTypeBuilder<StoredTrigger> builder)
 136    {
 5137        builder.Ignore(x => x.Payload);
 5138        builder.Property<string>("SerializedPayload");
 5139        builder.HasIndex(x => x.WorkflowDefinitionId).HasDatabaseName($"IX_{nameof(StoredTrigger)}_{nameof(StoredTrigger
 5140        builder.HasIndex(x => x.WorkflowDefinitionVersionId).HasDatabaseName($"IX_{nameof(StoredTrigger)}_{nameof(Stored
 5141        builder.HasIndex(x => x.Name).HasDatabaseName($"IX_{nameof(StoredTrigger)}_{nameof(StoredTrigger.Name)}");
 5142        builder.HasIndex(x => x.Hash).HasDatabaseName($"IX_{nameof(StoredTrigger)}_{nameof(StoredTrigger.Hash)}");
 5143        builder.HasIndex(x => x.TenantId).HasDatabaseName($"IX_{nameof(StoredTrigger)}_{nameof(StoredTrigger.TenantId)}"
 144
 145        // Add unique constraint to prevent duplicate trigger registrations in multi-engine environments
 146        // A trigger is uniquely identified by WorkflowDefinitionId + Hash + ActivityId + TenantId
 5147        builder.HasIndex(x => new
 5148            {
 5149                x.WorkflowDefinitionId,
 5150                x.Hash,
 5151                x.ActivityId,
 5152                x.TenantId
 5153            })
 5154            .IsUnique()
 5155            .HasDatabaseName($"IX_{nameof(StoredTrigger)}_Unique_{nameof(StoredTrigger.WorkflowDefinitionId)}_{nameof(St
 5156    }
 157
 158    /// <inheritdoc />
 159    public void Configure(EntityTypeBuilder<WorkflowExecutionLogRecord> builder)
 160    {
 5161        builder.Ignore(x => x.ActivityState);
 5162        builder.Ignore(x => x.Payload);
 5163        builder.Property<string>("SerializedActivityState");
 5164        builder.Property<string>("SerializedPayload");
 5165        builder.HasIndex(x => x.Timestamp).HasDatabaseName($"IX_{nameof(WorkflowExecutionLogRecord)}_{nameof(WorkflowExe
 5166        builder.HasIndex(x => x.Sequence).HasDatabaseName($"IX_{nameof(WorkflowExecutionLogRecord)}_{nameof(WorkflowExec
 5167        builder.HasIndex(x => new
 5168        {
 5169            x.Timestamp,
 5170            x.Sequence
 5171        }).HasDatabaseName($"IX_{nameof(WorkflowExecutionLogRecord)}_{nameof(WorkflowExecutionLogRecord.Timestamp)}_{nam
 5172        builder.HasIndex(x => x.ActivityInstanceId).HasDatabaseName($"IX_{nameof(WorkflowExecutionLogRecord)}_{nameof(Wo
 5173        builder.HasIndex(x => x.ParentActivityInstanceId).HasDatabaseName($"IX_{nameof(WorkflowExecutionLogRecord)}_{nam
 5174        builder.HasIndex(x => x.ActivityId).HasDatabaseName($"IX_{nameof(WorkflowExecutionLogRecord)}_{nameof(WorkflowEx
 5175        builder.HasIndex(x => x.ActivityType).HasDatabaseName($"IX_{nameof(WorkflowExecutionLogRecord)}_{nameof(Workflow
 5176        builder.HasIndex(x => x.ActivityTypeVersion).HasDatabaseName($"IX_{nameof(WorkflowExecutionLogRecord)}_{nameof(W
 5177        builder.HasIndex(x => new
 5178        {
 5179            x.ActivityType,
 5180            x.ActivityTypeVersion
 5181        }).HasDatabaseName($"IX_{nameof(WorkflowExecutionLogRecord)}_{nameof(WorkflowExecutionLogRecord.ActivityType)}_{
 5182        builder.HasIndex(x => x.ActivityName).HasDatabaseName($"IX_{nameof(WorkflowExecutionLogRecord)}_{nameof(Workflow
 5183        builder.HasIndex(x => x.EventName).HasDatabaseName($"IX_{nameof(WorkflowExecutionLogRecord)}_{nameof(WorkflowExe
 5184        builder.HasIndex(x => x.WorkflowDefinitionId).HasDatabaseName($"IX_{nameof(WorkflowExecutionLogRecord)}_{nameof(
 5185        builder.HasIndex(x => x.WorkflowDefinitionVersionId).HasDatabaseName($"IX_{nameof(WorkflowExecutionLogRecord)}_{
 5186        builder.HasIndex(x => x.WorkflowInstanceId).HasDatabaseName($"IX_{nameof(WorkflowExecutionLogRecord)}_{nameof(Wo
 5187        builder.HasIndex(x => x.WorkflowVersion).HasDatabaseName($"IX_{nameof(WorkflowExecutionLogRecord)}_{nameof(Workf
 5188        builder.HasIndex(x => x.TenantId).HasDatabaseName($"IX_{nameof(WorkflowExecutionLogRecord)}_{nameof(WorkflowExec
 5189    }
 190
 191    public void Configure(EntityTypeBuilder<WorkflowInboxMessage> builder)
 192    {
 5193        builder.Ignore(x => x.Input);
 5194        builder.Ignore(x => x.BookmarkPayload);
 5195        builder.Property<string>("SerializedInput");
 5196        builder.Property<string>("SerializedBookmarkPayload");
 5197        builder.HasIndex(x => x.ActivityTypeName, $"IX_{nameof(WorkflowInboxMessage)}_{nameof(WorkflowInboxMessage.Activ
 5198        builder.HasIndex(x => x.Hash, $"IX_{nameof(WorkflowInboxMessage)}_{nameof(WorkflowInboxMessage.Hash)}");
 5199        builder.HasIndex(x => x.WorkflowInstanceId, $"IX_{nameof(WorkflowInboxMessage)}_{nameof(WorkflowInboxMessage.Wor
 5200        builder.HasIndex(x => x.CorrelationId, $"IX_{nameof(WorkflowInboxMessage)}_{nameof(WorkflowInboxMessage.Correlat
 5201        builder.HasIndex(x => x.ActivityInstanceId, $"IX_{nameof(WorkflowInboxMessage)}_{nameof(WorkflowInboxMessage.Act
 5202        builder.HasIndex(x => x.CreatedAt, $"IX_{nameof(WorkflowInboxMessage)}_{nameof(WorkflowInboxMessage.CreatedAt)}"
 5203        builder.HasIndex(x => x.ExpiresAt, $"IX_{nameof(WorkflowInboxMessage)}_{nameof(WorkflowInboxMessage.ExpiresAt)}"
 5204    }
 205}