< 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: 141
Uncovered lines: 0
Coverable lines: 141
Total lines: 189
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%

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<SerializedKeyValuePair>,
 18    IEntityTypeConfiguration<WorkflowInboxMessage>
 19{
 20    /// <inheritdoc />
 21    public void Configure(EntityTypeBuilder<ActivityExecutionRecord> builder)
 22    {
 123        builder.Ignore(x => x.ActivityState);
 124        builder.Ignore(x => x.Exception);
 125        builder.Ignore(x => x.Payload);
 126        builder.Ignore(x => x.Outputs);
 127        builder.Ignore(x => x.Metadata);
 128        builder.Ignore(x => x.Properties);
 129        builder.Property<string>("SerializedActivityState");
 130        builder.Property<string>("SerializedActivityStateCompressionAlgorithm");
 131        builder.Property<string>("SerializedException");
 132        builder.Property<string>("SerializedPayload");
 133        builder.Property<string>("SerializedOutputs");
 134        builder.Property<string>("SerializedProperties");
 135        builder.Property<string>("SerializedMetadata");
 136        builder.Property(x => x.Status).HasConversion<string>();
 137        builder.HasIndex(x => x.WorkflowInstanceId).HasDatabaseName($"IX_{nameof(ActivityExecutionRecord)}_{nameof(Activ
 138        builder.HasIndex(x => x.ActivityId).HasDatabaseName($"IX_{nameof(ActivityExecutionRecord)}_{nameof(ActivityExecu
 139        builder.HasIndex(x => x.ActivityType).HasDatabaseName($"IX_{nameof(ActivityExecutionRecord)}_{nameof(ActivityExe
 140        builder.HasIndex(x => x.ActivityTypeVersion).HasDatabaseName($"IX_{nameof(ActivityExecutionRecord)}_{nameof(Acti
 141        builder.HasIndex(x => new
 142        {
 143            x.ActivityType,
 144            x.ActivityTypeVersion
 145        }).HasDatabaseName($"IX_{nameof(ActivityExecutionRecord)}_{nameof(ActivityExecutionRecord.ActivityType)}_{nameof
 146        builder.HasIndex(x => x.ActivityName).HasDatabaseName($"IX_{nameof(ActivityExecutionRecord)}_{nameof(ActivityExe
 147        builder.HasIndex(x => x.StartedAt).HasDatabaseName($"IX_{nameof(ActivityExecutionRecord)}_{nameof(ActivityExecut
 148        builder.HasIndex(x => x.HasBookmarks).HasDatabaseName($"IX_{nameof(ActivityExecutionRecord)}_{nameof(ActivityExe
 149        builder.HasIndex(x => x.Status).HasDatabaseName($"IX_{nameof(ActivityExecutionRecord)}_{nameof(ActivityExecution
 150        builder.HasIndex(x => x.CompletedAt).HasDatabaseName($"IX_{nameof(ActivityExecutionRecord)}_{nameof(ActivityExec
 151        builder.HasIndex(x => x.TenantId).HasDatabaseName($"IX_{nameof(ActivityExecutionRecord)}_{nameof(ActivityExecuti
 152        builder.HasIndex(x => x.SchedulingActivityExecutionId).HasDatabaseName($"IX_{nameof(ActivityExecutionRecord)}_{n
 153        builder.HasIndex(x => x.SchedulingActivityId).HasDatabaseName($"IX_{nameof(ActivityExecutionRecord)}_{nameof(Act
 154        builder.HasIndex(x => x.SchedulingWorkflowInstanceId).HasDatabaseName($"IX_{nameof(ActivityExecutionRecord)}_{na
 155    }
 56
 57    public void Configure(EntityTypeBuilder<BookmarkQueueItem> builder)
 58    {
 159        builder.Ignore(x => x.Options);
 160        builder.Property<string>("SerializedOptions");
 161        builder.HasIndex(x => x.StimulusHash, $"IX_{nameof(BookmarkQueueItem)}_{nameof(BookmarkQueueItem.StimulusHash)}"
 162        builder.HasIndex(x => x.WorkflowInstanceId, $"IX_{nameof(BookmarkQueueItem)}_{nameof(BookmarkQueueItem.WorkflowI
 163        builder.HasIndex(x => x.CorrelationId, $"IX_{nameof(BookmarkQueueItem)}_{nameof(BookmarkQueueItem.CorrelationId)
 164        builder.HasIndex(x => x.BookmarkId, $"IX_{nameof(BookmarkQueueItem)}_{nameof(BookmarkQueueItem.BookmarkId)}");
 165        builder.HasIndex(x => x.ActivityInstanceId, $"IX_{nameof(BookmarkQueueItem)}_{nameof(BookmarkQueueItem.ActivityI
 166        builder.HasIndex(x => x.ActivityTypeName, $"IX_{nameof(BookmarkQueueItem)}_{nameof(BookmarkQueueItem.ActivityTyp
 167        builder.HasIndex(x => x.CreatedAt, $"IX_{nameof(BookmarkQueueItem)}_{nameof(BookmarkQueueItem.CreatedAt)}");
 168        builder.HasIndex(x => x.TenantId, $"IX_{nameof(BookmarkQueueItem)}_{nameof(BookmarkQueueItem.TenantId)}");
 169    }
 70
 71    /// <inheritdoc />
 72    public void Configure(EntityTypeBuilder<SerializedKeyValuePair> builder)
 73    {
 174        builder.HasKey(x => x.Id);
 175        builder.Ignore(x => x.Key);
 176        builder.HasIndex(x => x.TenantId, $"IX_{nameof(SerializedKeyValuePair)}_{nameof(SerializedKeyValuePair.TenantId)
 177    }
 78
 79    /// <inheritdoc />
 80    public void Configure(EntityTypeBuilder<StoredBookmark> builder)
 81    {
 182        builder.Ignore(x => x.Payload);
 183        builder.Ignore(x => x.Metadata);
 184        builder.HasKey(b => b.Id);
 185        builder.Property<string>("SerializedPayload");
 186        builder.Property<string>("SerializedMetadata");
 187        builder.HasIndex(x => x.ActivityTypeName, $"IX_{nameof(StoredBookmark)}_{nameof(StoredBookmark.ActivityTypeName)
 188        builder.HasIndex(x => x.Name, $"IX_{nameof(StoredBookmark)}_{nameof(StoredBookmark.Name)}");
 189        builder.HasIndex(x => x.Hash, $"IX_{nameof(StoredBookmark)}_{nameof(StoredBookmark.Hash)}");
 190        builder.HasIndex(x => x.WorkflowInstanceId, $"IX_{nameof(StoredBookmark)}_{nameof(StoredBookmark.WorkflowInstanc
 191        builder.HasIndex(x => x.ActivityInstanceId, $"IX_{nameof(StoredBookmark)}_{nameof(StoredBookmark.ActivityInstanc
 192        builder.HasIndex(x => x.CreatedAt, $"IX_{nameof(StoredBookmark)}_{nameof(StoredBookmark.CreatedAt)}");
 193        builder.HasIndex(x => new
 194            {
 195                x.ActivityTypeName,
 196                x.Hash
 197            }, $"IX_{nameof(StoredBookmark)}_{nameof(StoredBookmark.ActivityTypeName)}_{nameof(StoredBookmark.Hash)}");
 198        builder.HasIndex(x => new
 199            {
 1100                x.ActivityTypeName,
 1101                x.Hash,
 1102                x.WorkflowInstanceId
 1103            }, $"IX_{nameof(StoredBookmark)}_{nameof(StoredBookmark.ActivityTypeName)}_{nameof(StoredBookmark.Hash)}_{na
 1104        builder.HasIndex(x => new
 1105            {
 1106                ActivityTypeName = x.Name,
 1107                x.Hash
 1108            }, $"IX_{nameof(StoredBookmark)}_{nameof(StoredBookmark.Name)}_{nameof(StoredBookmark.Hash)}");
 1109        builder.HasIndex(x => new
 1110            {
 1111                ActivityTypeName = x.Name,
 1112                x.Hash,
 1113                x.WorkflowInstanceId
 1114            }, $"IX_{nameof(StoredBookmark)}_{nameof(StoredBookmark.Name)}_{nameof(StoredBookmark.Hash)}_{nameof(StoredB
 1115        builder.HasIndex(x => x.TenantId, $"IX_{nameof(StoredBookmark)}_{nameof(StoredBookmark.TenantId)}");
 1116    }
 117
 118    /// <inheritdoc />
 119    public void Configure(EntityTypeBuilder<StoredTrigger> builder)
 120    {
 1121        builder.Ignore(x => x.Payload);
 1122        builder.Property<string>("SerializedPayload");
 1123        builder.HasIndex(x => x.WorkflowDefinitionId).HasDatabaseName($"IX_{nameof(StoredTrigger)}_{nameof(StoredTrigger
 1124        builder.HasIndex(x => x.WorkflowDefinitionVersionId).HasDatabaseName($"IX_{nameof(StoredTrigger)}_{nameof(Stored
 1125        builder.HasIndex(x => x.Name).HasDatabaseName($"IX_{nameof(StoredTrigger)}_{nameof(StoredTrigger.Name)}");
 1126        builder.HasIndex(x => x.Hash).HasDatabaseName($"IX_{nameof(StoredTrigger)}_{nameof(StoredTrigger.Hash)}");
 1127        builder.HasIndex(x => x.TenantId).HasDatabaseName($"IX_{nameof(StoredTrigger)}_{nameof(StoredTrigger.TenantId)}"
 128
 129        // Add unique constraint to prevent duplicate trigger registrations in multi-engine environments
 130        // A trigger is uniquely identified by WorkflowDefinitionId + Hash + ActivityId + TenantId
 1131        builder.HasIndex(x => new
 1132            {
 1133                x.WorkflowDefinitionId,
 1134                x.Hash,
 1135                x.ActivityId,
 1136                x.TenantId
 1137            })
 1138            .IsUnique()
 1139            .HasDatabaseName($"IX_{nameof(StoredTrigger)}_Unique_{nameof(StoredTrigger.WorkflowDefinitionId)}_{nameof(St
 1140    }
 141
 142    /// <inheritdoc />
 143    public void Configure(EntityTypeBuilder<WorkflowExecutionLogRecord> builder)
 144    {
 1145        builder.Ignore(x => x.ActivityState);
 1146        builder.Ignore(x => x.Payload);
 1147        builder.Property<string>("SerializedActivityState");
 1148        builder.Property<string>("SerializedPayload");
 1149        builder.HasIndex(x => x.Timestamp).HasDatabaseName($"IX_{nameof(WorkflowExecutionLogRecord)}_{nameof(WorkflowExe
 1150        builder.HasIndex(x => x.Sequence).HasDatabaseName($"IX_{nameof(WorkflowExecutionLogRecord)}_{nameof(WorkflowExec
 1151        builder.HasIndex(x => new
 1152        {
 1153            x.Timestamp,
 1154            x.Sequence
 1155        }).HasDatabaseName($"IX_{nameof(WorkflowExecutionLogRecord)}_{nameof(WorkflowExecutionLogRecord.Timestamp)}_{nam
 1156        builder.HasIndex(x => x.ActivityInstanceId).HasDatabaseName($"IX_{nameof(WorkflowExecutionLogRecord)}_{nameof(Wo
 1157        builder.HasIndex(x => x.ParentActivityInstanceId).HasDatabaseName($"IX_{nameof(WorkflowExecutionLogRecord)}_{nam
 1158        builder.HasIndex(x => x.ActivityId).HasDatabaseName($"IX_{nameof(WorkflowExecutionLogRecord)}_{nameof(WorkflowEx
 1159        builder.HasIndex(x => x.ActivityType).HasDatabaseName($"IX_{nameof(WorkflowExecutionLogRecord)}_{nameof(Workflow
 1160        builder.HasIndex(x => x.ActivityTypeVersion).HasDatabaseName($"IX_{nameof(WorkflowExecutionLogRecord)}_{nameof(W
 1161        builder.HasIndex(x => new
 1162        {
 1163            x.ActivityType,
 1164            x.ActivityTypeVersion
 1165        }).HasDatabaseName($"IX_{nameof(WorkflowExecutionLogRecord)}_{nameof(WorkflowExecutionLogRecord.ActivityType)}_{
 1166        builder.HasIndex(x => x.ActivityName).HasDatabaseName($"IX_{nameof(WorkflowExecutionLogRecord)}_{nameof(Workflow
 1167        builder.HasIndex(x => x.EventName).HasDatabaseName($"IX_{nameof(WorkflowExecutionLogRecord)}_{nameof(WorkflowExe
 1168        builder.HasIndex(x => x.WorkflowDefinitionId).HasDatabaseName($"IX_{nameof(WorkflowExecutionLogRecord)}_{nameof(
 1169        builder.HasIndex(x => x.WorkflowDefinitionVersionId).HasDatabaseName($"IX_{nameof(WorkflowExecutionLogRecord)}_{
 1170        builder.HasIndex(x => x.WorkflowInstanceId).HasDatabaseName($"IX_{nameof(WorkflowExecutionLogRecord)}_{nameof(Wo
 1171        builder.HasIndex(x => x.WorkflowVersion).HasDatabaseName($"IX_{nameof(WorkflowExecutionLogRecord)}_{nameof(Workf
 1172        builder.HasIndex(x => x.TenantId).HasDatabaseName($"IX_{nameof(WorkflowExecutionLogRecord)}_{nameof(WorkflowExec
 1173    }
 174
 175    public void Configure(EntityTypeBuilder<WorkflowInboxMessage> builder)
 176    {
 1177        builder.Ignore(x => x.Input);
 1178        builder.Ignore(x => x.BookmarkPayload);
 1179        builder.Property<string>("SerializedInput");
 1180        builder.Property<string>("SerializedBookmarkPayload");
 1181        builder.HasIndex(x => x.ActivityTypeName, $"IX_{nameof(WorkflowInboxMessage)}_{nameof(WorkflowInboxMessage.Activ
 1182        builder.HasIndex(x => x.Hash, $"IX_{nameof(WorkflowInboxMessage)}_{nameof(WorkflowInboxMessage.Hash)}");
 1183        builder.HasIndex(x => x.WorkflowInstanceId, $"IX_{nameof(WorkflowInboxMessage)}_{nameof(WorkflowInboxMessage.Wor
 1184        builder.HasIndex(x => x.CorrelationId, $"IX_{nameof(WorkflowInboxMessage)}_{nameof(WorkflowInboxMessage.Correlat
 1185        builder.HasIndex(x => x.ActivityInstanceId, $"IX_{nameof(WorkflowInboxMessage)}_{nameof(WorkflowInboxMessage.Act
 1186        builder.HasIndex(x => x.CreatedAt, $"IX_{nameof(WorkflowInboxMessage)}_{nameof(WorkflowInboxMessage.CreatedAt)}"
 1187        builder.HasIndex(x => x.ExpiresAt, $"IX_{nameof(WorkflowInboxMessage)}_{nameof(WorkflowInboxMessage.ExpiresAt)}"
 1188    }
 189}