diff --git a/src/Persistence/MartenTests/strong_typed_identifiers.cs b/src/Persistence/MartenTests/strong_typed_identifiers.cs
new file mode 100644
index 000000000..b183b6291
--- /dev/null
+++ b/src/Persistence/MartenTests/strong_typed_identifiers.cs
@@ -0,0 +1,88 @@
+using IntegrationTests;
+using Marten;
+using Microsoft.Extensions.Hosting;
+using Shouldly;
+using StronglyTypedIds;
+using Wolverine;
+using Wolverine.Marten;
+using Wolverine.Persistence;
+
+namespace MartenTests;
+
+public class strong_typed_identifiers : PostgresqlContext, IAsyncLifetime
+{
+ private IHost _host;
+
+ public async Task InitializeAsync()
+ {
+ _host = await Host.CreateDefaultBuilder()
+ .UseWolverine(opts =>
+ {
+ opts.Services.AddMarten(m =>
+ {
+ m.Connection(Servers.PostgresConnectionString);
+ m.DatabaseSchemaName = "knobs";
+ }).IntegrateWithWolverine();
+ }).StartAsync();
+ }
+
+ public async Task DisposeAsync()
+ {
+ await _host.StopAsync();
+ }
+
+ [Fact]
+ public async Task use_strong_typed_identifier_with_single_entity_attribute()
+ {
+ var knob1 = new Knob() { Name = "Single" };
+ using var session = _host.DocumentStore().LightweightSession();
+ session.Store(knob1);
+ await session.SaveChangesAsync();
+
+ await _host.InvokeAsync(new TwistKnob(knob1.Id));
+ }
+
+ [Fact]
+ public async Task use_with_multiple_entities_so_it_has_to_use_batch_querying()
+ {
+ var knob1 = new Knob() { Name = "One" };
+ var knob2 = new Knob() { Name = "Two" };
+ using var session = _host.DocumentStore().LightweightSession();
+ session.Store(knob1, knob2);
+ await session.SaveChangesAsync();
+
+ await _host.InvokeAsync(new TwistOneThenAnother(knob1.Id, knob2.Id));
+ }
+}
+
+[StronglyTypedId(Template.Guid)]
+public readonly partial struct KnobId;
+
+public class Knob
+{
+ public KnobId Id { get; set; }
+ public string Name { get; set; }
+}
+
+public record TwistKnob(KnobId Id);
+public record TwistOneThenAnother(KnobId Id1, KnobId Id2);
+
+public static class KnobHandler
+{
+ public static void Handle(TwistKnob command, [Entity] Knob knob)
+ {
+ knob.ShouldNotBeNull();
+ knob.Name.ShouldBe("Single");
+ }
+
+ public static void Handle(
+ TwistOneThenAnother command,
+ [Entity("Id1")] Knob knob1,
+ [Entity("Id2")] Knob knob2
+
+ )
+ {
+ knob1.Name.ShouldBe("One");
+ knob2.Name.ShouldBe("Two");
+ }
+}
\ No newline at end of file
diff --git a/src/Persistence/Wolverine.Marten/Persistence/Sagas/LoadDocumentFrame.cs b/src/Persistence/Wolverine.Marten/Persistence/Sagas/LoadDocumentFrame.cs
index 8914b2187..61b8c8720 100644
--- a/src/Persistence/Wolverine.Marten/Persistence/Sagas/LoadDocumentFrame.cs
+++ b/src/Persistence/Wolverine.Marten/Persistence/Sagas/LoadDocumentFrame.cs
@@ -11,6 +11,7 @@ namespace Wolverine.Marten.Persistence.Sagas;
internal class LoadDocumentFrame : AsyncFrame, IBatchableFrame
{
public const string ExpectedSagaRevision = "expectedSagaRevision";
+ private static Type[] _identityTypes = [typeof(int), typeof(long), typeof(string), typeof(Guid)];
private readonly Variable _sagaId;
private Variable? _cancellation;
@@ -23,16 +24,34 @@ public LoadDocumentFrame(Type sagaType, Variable sagaId)
_sagaId = sagaId;
uses.Add(sagaId);
- Saga = new Variable(sagaType, this);
+ var usage = $"{Variable.DefaultArgName(sagaType)}_{sagaId.Usage.Split('.').Last()}";
+ Saga = new Variable(sagaType, usage, this);
}
public void WriteCodeToEnlistInBatchQuery(GeneratedMethod method, ISourceWriter writer)
{
if (_batchQueryItem == null)
throw new InvalidOperationException("This frame has not been enlisted in a MartenBatchFrame");
-
+
writer.Write(
$"var {_batchQueryItem.Usage} = {_batchQuery!.Usage}.Load<{Saga.VariableType.FullNameInCode()}>({_sagaId.Usage});");
+
+ // var rawIdentityType = _sagaId.VariableType.IsNullable()
+ // ? _sagaId.VariableType.GetInnerTypeFromNullable()
+ // : _sagaId.VariableType;
+ //
+ // if (_identityTypes.Contains(rawIdentityType))
+ // {
+ //
+ // }
+ // else
+ // {
+ // var valueType = ValueTypeInfo.ForType(rawIdentityType);
+ // writer.Write(
+ // $"var {_batchQueryItem.Usage} = {_batchQuery!.Usage}.Load<{Saga.VariableType.FullNameInCode()}>({_sagaId.Usage}.{valueType.ValueProperty.Name});");
+ // }
+
+
}
public void EnlistInBatchQuery(Variable batchQuery)
diff --git a/src/Persistence/Wolverine.Marten/Wolverine.Marten.csproj b/src/Persistence/Wolverine.Marten/Wolverine.Marten.csproj
index eb2ce73e3..fec2a2fc4 100644
--- a/src/Persistence/Wolverine.Marten/Wolverine.Marten.csproj
+++ b/src/Persistence/Wolverine.Marten/Wolverine.Marten.csproj
@@ -12,7 +12,7 @@
-
+