3

何が起こっているのかを知るために、getting-started-with-event-store プロジェクトを書き直しました。テストのためにCanSaveExistingAggregate()、WrongExpectedVersionException が発生しています。問題は、何が起こっているのかを試して解決するために、期待されるバージョンを知りたいのですが、どうすればこれを見つけることができますか? テストでは、行repository.Save(firstSaved, Guid.NewGuid(), d => { });は予想されるバージョンを次のように計算し101ます。これが失敗する場所です。

        [Test]
    public void CanSaveExistingAggregate()
    {
        var savedId = SaveTestAggregateWithoutCustomHeaders(repository, 100 /* excludes TestAggregateCreated */);

        var firstSaved = repository.GetById<TestAggregate>(savedId);
        Console.WriteLine("version:" + firstSaved.Id);
        firstSaved.ProduceEvents(50);
        repository.Save(firstSaved, Guid.NewGuid(), d => { });

        var secondSaved = repository.GetById<TestAggregate>(savedId);
        Assert.AreEqual(150, secondSaved.AppliedEventCount);
    }

そして、例外がスローされるコード:

        public void Save(CommonDomain.IAggregate aggregate, Guid commitId, Action<IDictionary<string, object>> updateHeaders)
    {
        var commitHeaders = new Dictionary<string, object>
        {
            {CommitIdHeader, commitId},
            {AggregateClrTypeHeader, aggregate.GetType().AssemblyQualifiedName}
        };
        updateHeaders(commitHeaders);

        var streamName = aggregateIdToStreamName(aggregate.GetType(), aggregate.Id);
        var newEvents = aggregate.GetUncommittedEvents().Cast<object>().ToList();
        var originalVersion = aggregate.Version - newEvents.Count;
        var expectedVersion = originalVersion == 0 ? ExpectedVersion.NoStream : originalVersion;
        var eventsToSave = newEvents.Select(e => ToEventData(Guid.NewGuid(), e, commitHeaders)).ToList();
        if (eventsToSave.Count < WritePageSize)
        {
            eventStoreConnection.AppendToStream(streamName, expectedVersion, eventsToSave);
        }
        else
        {
            var transaction = eventStoreConnection.StartTransaction(streamName, expectedVersion);

            var position = 0;
            while (position < eventsToSave.Count)
            {
                var pageEvents = eventsToSave.Skip(position).Take(WritePageSize);
                transaction.Write(pageEvents);
                position += WritePageSize;
            }

            transaction.Commit();
        }

        aggregate.ClearUncommittedEvents();
    }

他のすべてのテストはパスします (ただしThrowsOnGetDeletedAggregate()、それについては後で質問します)。expectedVersion != ThrowsOnGetDeletedAggregate()

4

1 に答える 1

5

それは、コードを書くときの間違いだったことがわかりました。

var expectedVersion = originalVersion == 0 ? ExpectedVersion.NoStream : originalVersion; 

そのはず

var expectedVersion = originalVersion == 0 ? ExpectedVersion.NoStream : originalVersion - 1;
于 2013-11-25T22:30:54.817 に答える