public async Task Save(Guid aggregateId, ImmutableList<Event> events, int expectedVersion) { using (var session = _writeConnectionFactory.Connect()) { // TODO: use something different than a integer for the version var lastVersion = await GetLastVersion(session, aggregateId); if (expectedVersion != -1 && lastVersion != expectedVersion) { throw new ConcurrencyException(); } var insert = await session.PrepareAsync("INSERT INTO event (id, version, type, payload) VALUES (?, ?, ?, ?)"); var batch = new BatchStatement(); var increasingVersion = lastVersion; foreach (var evt in events) { batch.Add(insert.Bind( aggregateId, ++increasingVersion, evt.GetType().AssemblyQualifiedName, _serializer.Serialize(evt))); } await session.ExecuteAsync(batch); } }
public void Up() { using (var session = _writeConnectionFactory.Connect()) { var dropStatement = session.Prepare("DROP TABLE IF EXISTS event"); session.Execute(dropStatement.Bind()); var statement = session.Prepare( "CREATE TABLE event (id UUID, version INT, type TEXT, payload TEXT, PRIMARY KEY (id, version)) WITH CLUSTERING ORDER BY (version ASC)"); session.Execute(statement.Bind()); } }