Getting Started
Architecture
NServiceBus
Transports
ServiceInsight
ServicePulse
ServiceControl
Monitoring
Samples

Cosmos DB Persistence Upgrade from 1 to 2

EnableMigrationMode has moved

The previous location of the EnableMigrationMode has been deprecated and the persistenceConfiguration.Sagas().EnableMigrationMode() should be used instead.

Changes to transactions

Move to the new transactions API

A new Transactions API has been introduced to determine the PartitionKey and ContainerInformation. It is recommended to move from using a behavior-based approach to using this new API instead.

Identifying the PartitionKey

The most simple way to extract the PartitionKey from the headers is by using the following method:

var transactionInformation = persistence.TransactionInformation();
transactionInformation.ExtractPartitionKeyFromHeader("PartitionKeyHeader");

The most simple way to extract the PartitionKey from the message is by using the following method:

var transactionInformation = persistence.TransactionInformation();
transactionInformation.ExtractPartitionKeyFromMessage<MyMessage>(message => new PartitionKey(message.ItemId));

For more ways to set the PartitionKey see the Transactions API documentation.

Identifying the ContainerInformation

The most simple way to extract the ContainerInformation from the headers is by using the following method:

var transactionInformation = persistence.TransactionInformation();
transactionInformation.ExtractContainerInformationFromHeaders(headers => new ContainerInformation(headers["ContainerNameHeader"], new PartitionKeyPath("/partitionKeyPath")));

The most simple way to extract the ContainerInformation from the message is by using the following method:

var transactionInformation = persistence.TransactionInformation();
transactionInformation.ExtractContainerInformationFromMessage<MyMessage>(message => new ContainerInformation(message.ItemId.ToString(), new PartitionKeyPath("/partitionKey")));

For more ways to set the ContainerInformation see the Transactions API documentation.

LogicalOutboxBehavior has been deprecated

The LogicalOutboxBehavior has been marked as deprecated and will be internal only starting with version 3.0.

To continue to use Behaviors to determine the PartitionKey or ContainerInformation registration should be updated to use the string literal of the behavior class name:

public class RegisterMyBehavior : RegisterStep
{
    public RegisterMyBehavior() :
        base(stepId: nameof(PartitionKeyIncomingLogicalMessageContextBehavior),
        behavior: typeof(PartitionKeyIncomingLogicalMessageContextBehavior),
        description: "Determines the PartitionKey from the logical message",
        factoryMethod: b => new PartitionKeyIncomingLogicalMessageContextBehavior())
    {
-        InsertBeforeIfExists(nameof(LogicalOutboxBehavior));
+        InsertBeforeIfExists("LogicalOutboxBehavior");
    }
}