diff --git a/Directory.Build.props b/Directory.Build.props index 7f014d0aa6..a911ad0836 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,7 +1,7 @@ - 8.8.2 + 8.9.0 12.0 Jeremy D. Miller;Babu Annamalai;Jaedyn Tonee https://martendb.io/logo.png diff --git a/src/EventSourcingTests/Metadata/overriding_metadata_on_appends.cs b/src/EventSourcingTests/Metadata/overriding_metadata_on_appends.cs index cb3ad635b0..02dd510f5e 100644 --- a/src/EventSourcingTests/Metadata/overriding_metadata_on_appends.cs +++ b/src/EventSourcingTests/Metadata/overriding_metadata_on_appends.cs @@ -248,6 +248,31 @@ public async Task set_header_on_individual_events(EventAppendMode mode) events[2].Headers["color"].ShouldBe("green"); } + [Theory] + [InlineData(JasperFx.Events.EventAppendMode.Rich)] + [InlineData(JasperFx.Events.EventAppendMode.QuickWithServerTimestamps)] + public async Task override_header_on_event_with_as_type_then_get_header_but_declared_as_object(EventAppendMode mode) + { + EventAppendMode = mode; + var streamId = Guid.NewGuid(); + + var action = theSession.Events.StartStream(streamId, new AEvent(), new BEvent(), new CEvent()); + action.Events[0].SetHeader("color", "red"); + action.Events[1].SetHeader("color", "blue"); + action.Events[2].SetHeader("color", "green"); + + await theSession.SaveChangesAsync(); + + object data = new AEvent(); + var withHeader = theSession.Events.BuildEvent(data).WithHeader("color", "orange"); + withHeader.ShouldBeOfType>(); + theSession.Events.Append(streamId, withHeader); + await theSession.SaveChangesAsync(); + + var events = await theSession.Events.FetchStreamAsync(streamId); + events.Last().Headers["color"].ShouldBe("orange"); + } + /* TODO Do this w/ FetchForWriting where you pass in Event on new and old, quick and rich Append by passing in Event diff --git a/src/Marten/Events/EventStore.cs b/src/Marten/Events/EventStore.cs index 0b32652cce..89f59ebf85 100644 --- a/src/Marten/Events/EventStore.cs +++ b/src/Marten/Events/EventStore.cs @@ -20,6 +20,12 @@ public EventStore(DocumentSessionBase session, DocumentStore store, Tenant tenan _store = store; } + public IEvent BuildEvent(object data) + { + if (data == null) throw new ArgumentNullException(nameof(data)); + return _store.Events.BuildEvent(data); + } + public void OverwriteEvent(IEvent e) { var op = new OverwriteEventOperation(_store.Events, e); diff --git a/src/Marten/Events/IEventStoreOperations.cs b/src/Marten/Events/IEventStoreOperations.cs index 0c39ba08e9..85929c3d41 100644 --- a/src/Marten/Events/IEventStoreOperations.cs +++ b/src/Marten/Events/IEventStoreOperations.cs @@ -10,6 +10,14 @@ namespace Marten.Events; public interface IEventStoreOperations: IEventOperations, IQueryEventStore { + /// + /// Helper to create an event wrapper as part of appending events if you need + /// to express custom metadata + /// + /// + /// + IEvent BuildEvent(object data); + /// /// Append one or more events in order to an existing stream and verify that maximum event id for the stream /// matches supplied expected version or transaction is aborted.