AI agents: use the documentation index at llms.txt to locate machine-readable pages. This section is indexed by https://docs.particular.net/persistence/llms.txt. The markdown version of this page is served as plain text. An MCP server at /mcp serves the same content via the search_docs and read_doc tools; it is read-only and needs no credentials. Markdown versions of documentation pages are available by appending .md to the page URL. Directory URLs use index.md. They are served as text/plain because some retrieval backends reject text/markdown.

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");
    }
}