Benday.CosmosDb 5.2.0

dotnet add package Benday.CosmosDb --version 5.2.0
                    
NuGet\Install-Package Benday.CosmosDb -Version 5.2.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Benday.CosmosDb" Version="5.2.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Benday.CosmosDb" Version="5.2.0" />
                    
Directory.Packages.props
<PackageReference Include="Benday.CosmosDb" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Benday.CosmosDb --version 5.2.0
                    
#r "nuget: Benday.CosmosDb, 5.2.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Benday.CosmosDb@5.2.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Benday.CosmosDb&version=5.2.0
                    
Install as a Cake Addin
#tool nuget:?package=Benday.CosmosDb&version=5.2.0
                    
Install as a Cake Tool

Benday.CosmosDb

A collection of classes for implementing the domain model and repository patterns with Azure Cosmos Db. These classes are built using the Azure Cosmos DB libraries for .NET and aim to simplify using hierarchical partition keys and to make sure that query operations are created to use those partition keys correctly.

Written by Benjamin Day
Pluralsight Author | Microsoft MVP | Scrum.org Professional Scrum Trainer
https://www.benday.com
https://www.slidespeaker.ai
info@benday.com
YouTube: https://www.youtube.com/@_benday

Key features

  • Interfaces and base classes for implementing the repository pattern with CosmosDb
  • Interfaces and base classes for implementing the domain model pattern with CosmosDb
  • Service layer abstractions (IOwnedItemService, IParentedItemService)
  • Support for parent-child entity relationships with ParentedItemBase and IParentedItem
  • Help you to write LINQ queries against CosmosDb without having to worry whether you're using the right partition keys
  • Support for configuring repositories for use in ASP.NET Core projects
  • Support for hierarchical partition keys
  • Logging of query performance and request units
  • Detect and warn when you have cross-partition queries
  • Helper classes and methods for registering types and handling connection configuration
  • Ultra-simple configuration for Azure Cosmos DB Linux emulator
  • Optimistic concurrency control using ETags

Quick Start

For Azure Cosmos DB Emulator (Development)

{
  "CosmosConfiguration": {
    "UseEmulator": true
  }
}

That's it! See EMULATOR-SETUP.md for complete emulator configuration guide.

For Production

Option 1: Using appsettings.json

{
  "CosmosConfiguration": {
    "DatabaseName": "ProductionDb",
    "ContainerName": "ProductionContainer",
    "CreateStructures": false,
    "PartitionKey": "/pk,/discriminator",
    "HierarchicalPartitionKey": true,
    "Endpoint": "https://your-cosmos.documents.azure.com:443/",
    "UseDefaultAzureCredential": true
  }
}

Option 2: Using CosmosConfigBuilder

var config = new CosmosConfigBuilder()
    .WithEndpoint("https://your-cosmos.documents.azure.com:443/")
    .UseDefaultAzureCredential()
    .WithDatabase("ProductionDb")
    .WithContainer("ProductionContainer")
    .Build();

Quick Example

// Configure in Program.cs / Startup.cs
var cosmosConfig = builder.Configuration.GetCosmosConfig();
var cosmosBuilder = new CosmosRegistrationHelper(builder.Services, cosmosConfig);

// Register simple owned item
cosmosBuilder.RegisterRepositoryAndService<Note>();

// Register parented item with parent-child relationships
cosmosBuilder.RegisterParentedRepositoryAndService<Comment>();

// Use in your services
public class CommentService
{
    private readonly IParentedItemService<Comment> _commentService;

    public CommentService(IParentedItemService<Comment> commentService)
    {
        _commentService = commentService;
    }

    public async Task<IEnumerable<Comment>> GetCommentsForNote(string ownerId, string noteId)
    {
        // Query comments by parent ID with type discrimination
        return await _commentService.GetAllByParentIdAsync(ownerId, noteId, "Note");
    }
}

Custom Configuration Per Repository

You can register repositories with custom configuration values that override the defaults. This is useful when you need to store certain entity types in separate containers:

// Register LookupValue entities in a separate "LookupValues" container
cosmosBuilder.RegisterRepository<LookupValue, ILookupValueRepository, CosmosDbLookupValueRepository>(
    containerName: "LookupValues",
    withCreateStructures: true
);

Available configuration overrides:

  • connectionString - Use a different Cosmos DB endpoint
  • databaseName - Store in a different database
  • containerName - Store in a different container
  • partitionKey - Use a different partition key path
  • useHierarchicalPartitionKey - Override hierarchical partition key setting
  • useDefaultAzureCredential - Override authentication method
  • withCreateStructures - Override auto-creation of database/container

Any parameter left as null will use the default value from the CosmosRegistrationHelper instance.

Sample Application

A complete working sample application is included in this repository demonstrating all major features:

  • Person Entity - Demonstrates OwnedItemBase with custom repository and service layer implementations. Shows complex domain models with nested Address objects.
  • Note Entity - Simple OwnedItemBase implementation using default repository and service registrations. Serves as parent entity for Comments.
  • Comment Entity - Demonstrates ParentedItemBase pattern showing parent-child relationships with ParentId and ParentDiscriminator for type-safe queries.
  • LookupValue Entity - Demonstrates custom repository configuration to store entities in a separate Cosmos DB container using the RegisterRepository overload with configuration options.

To run the sample application:

  1. Start the Azure Cosmos DB Emulator (see EMULATOR-SETUP.md)
  2. Run Benday.CosmosDb.SampleApp.WebUi
  3. Explore the different entity patterns and their implementations

Resources

📚 Full Documentation 💻 Sample Application - Working examples of all patterns 📦 NuGet Package 🐙 Source Code 📖 Repository API Documentation 📖 Domain Model API Documentation

Feedback & Contributions

Got ideas for CosmosDb functionality that you'd like to see? Found a bug? Let us know by submitting an issue. Want to contribute? Submit a pull request.

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.1 is compatible. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (2)

Showing the top 2 NuGet packages that depend on Benday.CosmosDb:

Package Downloads
Benday.Identity.CosmosDb

ASP.NET Core Identity implementation using Azure Cosmos DB as the backing store. Provides user store, role store, claims, lockout, two-factor authentication, and external login support. Built on top of the Benday.CosmosDb repository pattern library.

Benday.Identity.CosmosDb.UI

ASP.NET Core Identity UI for Azure Cosmos DB. Provides pre-built Login/Logout/AccessDenied Razor Pages, a RedirectToLogin Blazor component, and AddCosmosIdentityWithUI() convenience method that combines core identity registration with cookie authentication. Built on top of Benday.Identity.CosmosDb.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
5.2.0 302 1/9/2026
5.1.0 291 12/16/2025
5.0.0 330 11/12/2025
4.10.0 229 11/6/2025
4.9.0 175 9/27/2025
4.8.0 369 8/8/2025
4.7.1 285 8/7/2025
4.6.1 249 6/14/2025
4.5.0 216 4/25/2025
4.4.0 214 3/22/2025
4.3.0 159 3/21/2025
4.2.2 168 3/21/2025
4.2.0 289 3/7/2025
4.0.0 275 3/3/2025
3.0.0 172 2/28/2025
2.1.0 290 11/20/2024
2.0.0 178 11/14/2024
1.0.0 201 10/30/2024

v5.2 - Added bulk delete support to repository;
v5.1 - Added per-repository custom container configuration support;
v5.0 - Adding IParentedItem interface and IParentedItemRepository interface plus CosmosDbParentedItemRepository to support items that have a parent-child relationship in CosmosDb;
v4.10 - Fixing bugs where etag and timestamp not getting updated on Save;
v4.9 - Added simplified config options for local emulator; Added configuration builder extension method to simplify configuration of cosmos db in web projects; Added better paging support to repository;
v4.8 - Refactored batch save to make the saving of each batch be a protected virtual method; Added batch size property;
v4.7 - Adding BeforeSaveBatch and AfterSaveBatch template methods;
v4.6 - Added configure option to use DefaultAzureCredential for authentication using managed service ids in azure; Fixed bug where cosmos client was improperly registered in DI when using managed ids;
v4.5 - Added option to configure 'allow bulk execution' for the CosmosClient; Default value for 'allow bulk execution' is now true;
v4.4 - Changed configuration reader to use default values rather than throwing exceptions when optional values are missing;
v4.3 - Fixed bug where UseHierarchicalPartitionKey was sometimes not being set;
v4.2.2 - Allowed cosmos db options UseHierarchicalPartitionKey to be set-able;
v4.2.1 - Minor bug fix release;
v4.2 - Fixed partition key bug on SaveAsync when in flat-partition key mode;
v4.1 - Added option to CosmosConfig.ConnectionString to enable GatewayMode via connection string;
v4.0 - Added support for non-hierarchical partition keys and made it the default; Added support for the beta version of the linux emulator container; Added configuration options for gateway mode and database throughput; Breaking change: renamed OwnedItemService interface and classes;
v3.0 - Changed framework target to be netstandard2.1; Added helper classes and methods to simplify type registrations;
v2.1 - Added optimistic concurrency checks using _etag to the repository SaveAsync method.
v2.0 - Changed implementation to use System.Text.Json for serialization instead of Newtonsoft.Json. Added configuration utilities to make it easier to configure CosmosDb in web projects. Added service layer base classes.
v1.0 - Adding initial version of the CosmosDb Domain Model & Repository utilities