Cosmonaut 2.0.4
See the version list below for details.
dotnet add package Cosmonaut --version 2.0.4
NuGet\Install-Package Cosmonaut -Version 2.0.4
<PackageReference Include="Cosmonaut" Version="2.0.4" />
paket add Cosmonaut --version 2.0.4
#r "nuget: Cosmonaut, 2.0.4"
// Install Cosmonaut as a Cake Addin #addin nuget:?package=Cosmonaut&version=2.0.4 // Install Cosmonaut as a Cake Tool #tool nuget:?package=Cosmonaut&version=2.0.4
Cosmonaut
The word was derived from "kosmos" (Ancient Greek: κόσμος) which means world/universe and "nautes" (Ancient Greek: ναῦς) which means sailor/navigator
Cosmonaut is an object mapper that enables .NET developers to work with a CosmosDB using .NET objects. It eliminates the need for most of the data-access code that developers usually need to write.
Getting started
- How to easily start using CosmosDB in your C# application in no time with Cosmonaut
- (Video) Getting started with .NET Core and CosmosDB using Cosmonaut
- (Video) How to save money in CosmosDB with Cosmonaut's Collection Sharing
Usage
The idea is pretty simple. You can have one CosmoStore per entity (POCO/dtos etc) This entity will be used to create a collection in the cosmosdb and it will offer all the data access for this object
Registering the CosmosStores in ServiceCollection for DI support
var cosmosSettings = new CosmosStoreSettings("<<databaseName>>",
"<<cosmosUri>>"),
"<<authkey>>");
serviceCollection.AddCosmosStore<Book>(cosmosSettings);
//or just by using the Action extension
serviceCollection.AddCosmosStore<Book>(options =>
{
options.DatabaseName = "<<databaseName>>";
options.AuthKey = "<<authkey>>";
options.EndpointUrl = new Uri("<<cosmosUri>>");
});
//or just initialise the object
ICosmosStore<Book> bookStore = new CosmosStore<Book>(cosmosSettings)
Retrieving an entity by id (and partition key)
var user = await cosmosStore.FindAsync("userId");
var user = await cosmosStore.FindAsync("userId", "partitionKey");
var user = await cosmosStore.FindAsync("userId", new RequestOptions());
Quering for entities using LINQ
In order to query for entities all you have to do is call the .Query()
method and then use LINQ to create the query you want.
It is HIGHLY recommended that you use one of the Async
methods to get the results back, such as ToListAsync
or FirstOrDefaultAsync
, when available.
var user = await cosmoStore.Query().FirstOrDefaultAsync(x => x.Username == "elfocrash");
var users = await cosmoStore.Query().Where(x => x.HairColor == HairColor.Black).ToListAsync(cancellationToken);
Quering for entities using SQL
// plain sql query
var user = await cosmoStore.QueryMultipleAsync("select * from c w.Firstname = 'Smith'");
// or parameterised sql query
var user = await cosmoStore.QueryMultipleAsync("select * from c w.Firstname = @name", new { name = "Smith" });
Adding an entity in the entity store
var newUser = new User
{
Name = "Nick"
};
var added = await cosmoStore.AddAsync(newUser);
var multiple = await cosmoStore.AddRangeAsync(manyManyUsers);
Updating entities
When it comes to updating you have two options.
Update...
await cosmoStore.UpdateAsync(entity);
... and Upsert
await cosmoStore.UpsertAsync(entity);
The main difference is of course in the functionality. Update will only update if the item you are updating exists in the database with this id. Upsert on the other hand will either add the item if there is no item with this id or update it if an item with this id exists.
Removing entities
await cosmoStore.RemoveAsync(x => x.Name == "Nick"); // Removes all the entities that match the criteria
await cosmoStore.RemoveAsync(entity);// Removes the specific entity
await cosmoStore.RemoveByIdAsync("<<anId>>");// Removes an entity with the specified ID
Collection sharing
Cosmonaut is all about making the integration with CosmosDB easy as well as making things like cost optimisation part of the library.
That's why Cosmonaut support collection sharing between different types of entities.
Why would you do that?
Cosmos is charging you based on how many RU/s your individual collection is provisioned at. This means that if you don't need to have one collection per entity because you won't use it that much, even on the minimum 400 RU/s, you will be charged money. That's where the magic of schemaless comes in.
How can you do that?
Well it's actually pretty simple. Just implement the ISharedCosmosEntity
interface and decorate your object with the SharedCosmosCollection
attribute.
The attribute accepts two properties, SharedCollectionName
which is mandatory and EntityPrefix
which is optional.
The SharedCollectionName
property will be used to name the collection that the entity will share with other entities.
The CosmosEntityName
will be used to make the object identifiable for Cosmosnaut. Be default it will pluralize the name of the class, but you can specify it to override this behavior.
Once you set this up you can add individual CosmosStores with shared collections.
Something worths noting is that because you will use this to share objects partitioning will be virtually impossible. For that reason the id
will be used as a partition key by default as it is the only property that will be definately shared between all objects.
Restrictions
Because of the way the internal id
property of Cosmosdb works, there is a mandatory restriction made.
You cannot have a property named Id or a property with the attribute [JsonProperty("id")]
without it being a string.
A cosmos id need to exist somehow on your entity model. For that reason if it isn't part of your entity you can just extend the CosmosEntity
class.
It is HIGHLY RECOMMENDED that you decorate your Id property with the [JsonProperty("id")]
attribute to prevent any unexpected behaviour.
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. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. 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.0
- Humanizer.Core.uk (>= 2.4.2)
- Microsoft.Azure.DocumentDB.Core (>= 1.9.1)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 2.1.1)
NuGet packages (9)
Showing the top 5 NuGet packages that depend on Cosmonaut:
Package | Downloads |
---|---|
Cosmonaut.Extensions.Microsoft.DependencyInjection
Microsoft Dependency Injection extension methods |
|
Cosmonaut.ApplicationInsights
ApplicationInsights support for Cosmonaut |
|
Marketplace.Helpers
Helpers for OrderCloud middleware projects |
|
trifenix.connect.db.cosmos
Operaciones de base de datos cosmos db |
|
trifenix.connect.entities.cosmos
Entidades base para base de datos cosmos db usadas en trifenix connect. |
GitHub repositories (1)
Showing the top 1 popular GitHub repositories that depend on Cosmonaut:
Repository | Stars |
---|---|
Elfocrash/Cosmonaut
🌐 A supercharged Azure CosmosDB .NET SDK with ORM support
|
Version | Downloads | Last updated |
---|---|---|
3.0.0-preview1 | 79,391 | 10/20/2019 |
2.11.3 | 381,083 | 7/5/2019 |
2.10.0 | 57,376 | 3/23/2019 |
2.9.0 | 5,337 | 2/28/2019 |
2.8.2 | 15,693 | 1/17/2019 |
2.8.1 | 1,259 | 1/10/2019 |
2.7.1 | 5,751 | 12/11/2018 |
2.7.0 | 29,071 | 12/3/2018 |
2.6.2 | 2,470 | 11/15/2018 |
2.5.0 | 2,507 | 11/8/2018 |
2.4.2 | 3,946 | 10/8/2018 |
2.4.0 | 3,749 | 9/24/2018 |
2.3.2 | 1,977 | 9/20/2018 |
2.2.0 | 95,130 | 9/12/2018 |
2.0.4 | 3,038 | 9/7/2018 |
2.0.3 | 1,898 | 8/9/2018 |
Please report any issues on Github.