Benday.CosmosDb
5.2.0
dotnet add package Benday.CosmosDb --version 5.2.0
NuGet\Install-Package Benday.CosmosDb -Version 5.2.0
<PackageReference Include="Benday.CosmosDb" Version="5.2.0" />
<PackageVersion Include="Benday.CosmosDb" Version="5.2.0" />
<PackageReference Include="Benday.CosmosDb" />
paket add Benday.CosmosDb --version 5.2.0
#r "nuget: Benday.CosmosDb, 5.2.0"
#:package Benday.CosmosDb@5.2.0
#addin nuget:?package=Benday.CosmosDb&version=5.2.0
#tool nuget:?package=Benday.CosmosDb&version=5.2.0
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
ParentedItemBaseandIParentedItem - 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 endpointdatabaseName- Store in a different databasecontainerName- Store in a different containerpartitionKey- Use a different partition key pathuseHierarchicalPartitionKey- Override hierarchical partition key settinguseDefaultAzureCredential- Override authentication methodwithCreateStructures- 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
OwnedItemBasewith custom repository and service layer implementations. Shows complex domain models with nested Address objects. - Note Entity - Simple
OwnedItemBaseimplementation using default repository and service registrations. Serves as parent entity for Comments. - Comment Entity - Demonstrates
ParentedItemBasepattern showing parent-child relationships withParentIdandParentDiscriminatorfor type-safe queries. - LookupValue Entity - Demonstrates custom repository configuration to store entities in a separate Cosmos DB container using the
RegisterRepositoryoverload with configuration options.
To run the sample application:
- Start the Azure Cosmos DB Emulator (see EMULATOR-SETUP.md)
- Run
Benday.CosmosDb.SampleApp.WebUi - 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 | Versions 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. |
-
.NETStandard 2.1
- Azure.Identity (>= 1.17.1)
- Benday.Common (>= 9.10.0)
- Microsoft.Azure.Cosmos (>= 3.56.0)
- Microsoft.Extensions.Configuration (>= 10.0.1)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.1)
- Microsoft.Extensions.Options (>= 10.0.1)
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