private int GetEventSourceVersion(AlternativeDomain.EventSource eventSource) { if (eventSource == null) { return(0); } return(eventSource.Version); }
public void SaveEventsNotAtomically(Guid aggregateId, int expectedVersion, List <Event> events) { var eventSources = _database.GetCollection <AlternativeDomain.EventSource>("EventSource2"); var eventSource = eventSources.FindSync(x => x.AggregateId == aggregateId).FirstOrDefault(); bool existedAggregate = true; if (eventSource == null) { existedAggregate = false; eventSource = new AlternativeDomain.EventSource { AggregateId = aggregateId, Version = 0 }; } var currentVersion = GetEventSourceVersion(eventSource); if (expectedVersion != currentVersion) { throw new Exception("Concurrency problem"); } foreach (var e in events) { e.Version = ++currentVersion; } eventSource.Version += events.Count; if (existedAggregate) { eventSources.UpdateOne(x => x.AggregateId == aggregateId, new UpdateDefinitionBuilder <AlternativeDomain.EventSource>() .Set(x => x.Version, eventSource.Version)); } else { eventSources.InsertOne(eventSource); } var eventsCollection = _database.GetCollection <AlternativeDomain.Event>("Event"); eventsCollection.InsertMany(events.Select(x => new AlternativeDomain.Event { AggregateId = aggregateId, Version = x.Version, Data = x.Data, Date = x.Date })); }