private DomainEventEnvelope GetDomainEventWrapperFromEvent(TEventSet @event)
        {
            var domainEvent = _serializer.Deserialize <object>(@event.Payload);

            return(new DomainEventEnvelope(@event.EventId, @event.AggregateId, @event.Sequence, @event.AggregateVersion,
                                           domainEvent));
        }
        public Tuple <TAggregateRoot, int> GetLatestSnapshot(Guid aggregateId)
        {
            var lastEventSequence = 0;

            var snapshotSet = Context.Set <TAggregateMemento>();
            var snapshot    =
                snapshotSet.AsNoTracking()
                .OrderByDescending(s => s.LastEventSequence)
                .FirstOrDefault(x => x.AggregateRootId == aggregateId);

            if (snapshot == null)
            {
                return(null);
            }

            lastEventSequence = snapshot.LastEventSequence;

            var stringSerializer = new JsonObjectSerializer();
            var aggregateRoot    = stringSerializer.Deserialize <TAggregateRoot>(snapshot.Payload);

            return(new Tuple <TAggregateRoot, int>(aggregateRoot, lastEventSequence));
        }