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

Well it turns out it was just a mistake when writing the code, rather than

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

it should be

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