EntityDb.Common 6.0.1

There is a newer version of this package available.
See the version list below for details.
dotnet add package EntityDb.Common --version 6.0.1
NuGet\Install-Package EntityDb.Common -Version 6.0.1
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="EntityDb.Common" Version="6.0.1" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add EntityDb.Common --version 6.0.1
#r "nuget: EntityDb.Common, 6.0.1"
#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.
// Install EntityDb.Common as a Cake Addin
#addin nuget:?package=EntityDb.Common&version=6.0.1

// Install EntityDb.Common as a Cake Tool
#tool nuget:?package=EntityDb.Common&version=6.0.1

EntityDb.NET Codacy Badge Codacy Badge Build

At its core, EntityDb.NET is a set of abstractions and implementations for the Event Sourcing pattern, with the added ability to enforce uniqueness constraints and the ability to tag resources.

What is Event Sourcing?

Event Sourcing centers around the idea that your source of truth is not the current state, it is all of the deltas that add up to the current state. Consider your personal bank - which of these options do you think it their source of truth for account balances?

  • Option A - Table Rows
    • John Doe has $123.45 in Account A
    • Jane Doe has $678.90 in Account B
  • Option B - Transactions
    • John Doe deposited $100.00 in Account A
    • Jane Doe deposited $600.00 in Account B
    • John Doe deposited $20.00 in Account A
    • Jane Doe deposited $70.00 in Account B
    • John Doe deposited $3.45 in Account A
    • Jane Doe deposited $8.90 in Account B

The answer is pretty obvious if you go check your bank statement. They keep a set of transactions, and regurgitate that information on the statement. (If I'm wrong, you should consider getting a new bank, ASAP!)

How does EntityDb.NET implement Event Sourcing?

There are five core objects at the heart of this implementation

  1. Transactions
  2. Agent
  3. Commands
  4. Tags
  5. Leases

Transactions

A transaction represents an atomic operation on multiple entities. A transaction is ideally* committed atomically or not at all. If some step in the transaction fails, the entire transaction should fail.

*In the MongoDb implementation, the transaction is committed atomically. However, it is possible in the future that there will be implementations that are not capable of doing this if you want to use tags and/or leases. An example would be EventStore, which provides no ability to enforce uniqueness constraints in its transaction. Such implementations will need a complimentary transaction in order to make use of tags and leases.

Agent

An agent is an actor that can execute transactions. For example, if a transaction is initiated via an HTTP API, you might use the HttpContextAgent - it's signature includes headers and connection information, and it uses the ClaimsPrincipal to decide if an agent has a particular role required for authorized commands.

Commands

A command represents the intent to perform some operation on a single entity. Going back to the bank account example, one command could be PerformDeposit while another could be PerformWithdrawl. The things that you can do are commands.

Tags

A tag is a way to index entities by some piece of information. A tag can have a label and a value, both of which are strings. Many accounts are typed, and you could represent this with a tag where Label is Type and Value is Savings or Checking. You could then run a query to get the account id of all accounts where Label is Type and Value is Savings. The number of savings accounts in the system would be the number of entity ids.

Leases

A lease is like a tag, except that it has a uniqueness constraint. Many banks have online portals, allowing bank members to see their accounts on the internet. From the bank's perspective, all of the accounts should be tied to a member id, probably a guid. But the member will not want to remember nor lookup this guid - they will want to use a username. What you can do in EntityDb is make a lease for member entities where the entity id is the member id, the Label is Username and the Value is whatever username the member wants to use. If an attempt to commit a transaction is made that would violate the uniqueness constraint, it will be rejected. (This is obnoxious behavior for the user, though, so the bank should check before attempting to commit to see if the username is available and give immediate feedback to choose a different username).

Product Compatible and additional computed target framework versions.
.NET net6.0 is compatible.  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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (8)

Showing the top 5 NuGet packages that depend on EntityDb.Common:

Package Downloads
EntityDb.MongoDb

An implementation of the EntityDb Transaction Repository interface, specifically for MongoDb.

EntityDb.Mvc

Provides a model for a Transaction Source that is mapped from an HttpContext. The source includes: Claims, Connection Information, and Raw Headers.

EntityDb.Redis

An implementation of the EntityDb Snapshot Repository interface, specifically for Redis.

EntityDb.Void

An implementation of the EntityDb Transaction Repository interface, specifically made for non-persistent history.

EntityDb.InMemory

An implementation of the EntityDb Snapshot Repository interface, specifically for in-memory.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
9.2.0 224 8/30/2023
9.1.0 171 8/30/2023
9.0.0 492 11/20/2022
8.1.1 435 9/5/2023
8.0.4 901 11/24/2022
8.0.3 1,300 9/8/2022
8.0.2 1,233 8/8/2022
8.0.1 1,336 8/7/2022
8.0.0 883 8/7/2022
7.1.1 910 9/7/2022
7.1.0 947 7/10/2022
7.0.0 967 7/4/2022
6.7.0 948 6/24/2022
6.6.0 918 6/24/2022
6.5.0 963 5/19/2022
6.5.0-build2 180 5/24/2022
6.4.0 921 5/19/2022
6.3.0 943 5/18/2022
6.2.0 1,046 4/6/2022
6.1.0 992 4/6/2022
6.0.2 972 4/6/2022
6.0.1 951 4/6/2022
6.0.0 960 3/30/2022
5.0.0 926 2/27/2022
4.0.1 545 12/29/2021
4.0.0 493 12/29/2021
3.6.0 525 12/20/2021
3.5.0 536 12/19/2021
3.4.0 533 12/18/2021
3.3.0 545 12/18/2021
3.2.0 642 10/8/2021
3.1.0 605 10/7/2021
3.0.0 623 10/7/2021
2.3.0 602 10/6/2021
2.2.0 702 10/1/2021
2.1.3 660 9/27/2021
2.1.2 619 9/26/2021
2.1.1 640 9/26/2021
2.1.0 635 9/26/2021
2.0.3 546 9/17/2021
2.0.2 579 9/12/2021
2.0.0 548 7/22/2021
1.0.9 494 6/19/2021
1.0.8 474 6/17/2021
1.0.7 488 6/15/2021
1.0.6 507 6/15/2021
1.0.5 519 6/8/2021
1.0.4 505 5/28/2021
1.0.3 460 5/27/2021
1.0.2 146 5/27/2021
1.0.1 462 5/26/2021
1.0.0 505 5/24/2021