EngineBay.Persistence 8.0.0

dotnet add package EngineBay.Persistence --version 8.0.0                
NuGet\Install-Package EngineBay.Persistence -Version 8.0.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="EngineBay.Persistence" Version="8.0.0" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add EngineBay.Persistence --version 8.0.0                
#r "nuget: EngineBay.Persistence, 8.0.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.
// Install EngineBay.Persistence as a Cake Addin
#addin nuget:?package=EngineBay.Persistence&version=8.0.0

// Install EngineBay.Persistence as a Cake Tool
#tool nuget:?package=EngineBay.Persistence&version=8.0.0                

EngineBay.Persistence

NuGet version Maintainability Test Coverage

Persistence module for EngineBay published to EngineBay.Persistence on NuGet.

About

The persistence module provides structures to configure and register any database connections that modules in your application might need.

The DbContexts from this module should be inherited by the DbContexts of any module that needs to use a database. To support Command and Query Responsibility Segregation (CQRS), a read-optimised and a write-optimised DbContext are provided - though a general-purpose one is also provided.

The TimestampInterceptor will add creation and modification timestamps to any model that implements EngineBay.Core's BaseModel.

The AuditableModel abstract class will provide some standard fields for tracking which users make changes to any inheriting models. If changes are saved on a DbContext that uses EngineBay.Auditing's AuditInterceptor, then audit entries will automatically be created for any models that implement AuditableModel.

ApplicationUser is a simple representation of a user for the application. It has a DbSet provided in ModuleDbContext so that any module inheriting these contexts will have access to the application users. ApplicationUser implements AuditableModel.

Usage

To use this module in your own, you will need to create three DbContexts - generic, read, and write - so that they can be registered. With the currently preferred structure, they will need to inherit from the Persistence DbContexts in a chain like shown in this diagram (using EngineBay.Blueprints module as an example):

%%{init: {"flowchart": {"htmlLabels": false}} }%%
flowchart BT
    BlueprintsWriteDbContext --> BlueprintsQueryDbContext
    BlueprintsQueryDbContext --> BlueprintsDbContext
    BlueprintsDbContext --> ModuleWriteDbContext
    ModuleWriteDbContext --> ModuleQueryDbContext
    ModuleQueryDbContext --> ModuleDbContext
    click ModuleDbContext "https://github.com/engine-bay/persistence/blob/feature/readmes/EngineBay.Persistence/DbContexts/ModuleDbContext.cs" _blank
    click ModuleQueryDbContext "https://github.com/engine-bay/persistence/blob/feature/readmes/EngineBay.Persistence/DbContexts/ModuleQueryDbContext.cs" _blank
    click ModuleWriteDbContext "https://github.com/engine-bay/persistence/blob/feature/readmes/EngineBay.Persistence/DbContexts/ModuleWriteDbContext.cs" _blank
    click BlueprintsDbContext "https://github.com/engine-bay/blueprints/blob/main/EngineBay.Blueprints/Persistence/BlueprintsDbContext.cs" _blank
    click BlueprintsQueryDbContext "https://github.com/engine-bay/blueprints/blob/main/EngineBay.Blueprints/Persistence/BlueprintsQueryDbContext.cs" _blank
    click BlueprintsWriteDbContext "https://github.com/engine-bay/blueprints/blob/main/EngineBay.Blueprints/Persistence/BlueprintsWriteDbContext.cs" _blank

You should register your DbSets only in your generic DbContext:

namespace EngineBay.Blueprints
{
    using EngineBay.Persistence;
    using Microsoft.EntityFrameworkCore;

    public class BlueprintsDbContext : ModuleWriteDbContext
    {
        public BlueprintsDbContext(DbContextOptions<ModuleWriteDbContext> options)
            : base(options)
        {
        }

        public DbSet<Workbook> Workbooks { get; set; } = null!;

        public DbSet<Blueprint> Blueprints { get; set; } = null!;

        // More DbSets...

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            Workbook.CreateDataAnnotations(modelBuilder);
            Blueprint.CreateDataAnnotations(modelBuilder);
            // More annotations...

            base.OnModelCreating(modelBuilder);
        }
    }
}

If you desire extra functionality for any of the contexts, such as an auditing interceptor from EngineBay.Auditing, you can access the options builder with the OnConfiguring method, like this:

namespace EngineBay.Blueprints
{
    using EngineBay.Auditing;
    using EngineBay.Persistence;
    using Microsoft.EntityFrameworkCore;

    public class BlueprintsWriteDbContext : BlueprintsQueryDbContext
    {
        private readonly IAuditingInterceptor auditingInterceptor;

        public BlueprintsWriteDbContext(DbContextOptions<ModuleWriteDbContext> options, IAuditingInterceptor auditingInterceptor)
            : base(options)
        {
            this.auditingInterceptor = auditingInterceptor;
        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            ArgumentNullException.ThrowIfNull(optionsBuilder);

            optionsBuilder.AddInterceptors(this.auditingInterceptor);

            base.OnConfiguring(optionsBuilder);
        }
    }
}

When you've created your module's DbContexts, you will need to create a CQRSDatabaseConfiguration object in your module's setup class that will register the contexts. For example:

namespace EngineBay.Blueprints
{
    using EngineBay.Core;
    using EngineBay.Persistence;
    using FluentValidation;

    public class BlueprintsModule : BaseModule
    {
        public override IServiceCollection RegisterModule(IServiceCollection services, IConfiguration configuration)
        {
            // Other services registration...

            var databaseConfiguration = new CQRSDatabaseConfiguration<BlueprintsDbContext, BlueprintsQueryDbContext, BlueprintsWriteDbContext>();
            databaseConfiguration.RegisterDatabases(services);

            return services;
        }

        // Other setup methods...
    }
}

You will then be able to use your DbContexts freely, as you might any other DbContext, though do try to keep CQRS principals in mind.

Registration

This module cannot run on its own. You will need to register it in your application to use its functionality. See the Demo API registration guide.

Note that you do not need to register the Persistence DbContexts. The ApplicationUsers DbSet that these contexts provide will be available to any other module's DbContexts by virtue of inheritance.

Environment Variables

See the Documentation Portal.

Dependencies

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  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 (5)

Showing the top 5 NuGet packages that depend on EngineBay.Persistence:

Package Downloads
EngineBay.Blueprints

Package Description

EngineBay.Authentication

Package Description

EngineBay.Auditing

Package Description

EngineBay.DatabaseManagement

Package Description

EngineBay.DemoModule

Package Description

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
8.0.0 506 2/12/2024
7.0.2 336 1/16/2024
7.0.1 180 1/10/2024
7.0.0 244 1/9/2024
6.0.8 143 1/3/2024
6.0.7 113 1/3/2024
6.0.6 120 1/3/2024
6.0.5 144 12/21/2023
6.0.4 503 12/20/2023
6.0.3 612 12/6/2023
6.0.2 145 11/29/2023
6.0.1 374 11/23/2023
6.0.0 183 11/23/2023
5.0.7 132 11/20/2023
5.0.6 136 11/17/2023
5.0.5 439 11/15/2023
5.0.4 133 11/9/2023
5.0.3 124 11/9/2023
5.0.2 122 11/9/2023
5.0.1 298 11/2/2023
5.0.0 679 10/31/2023
4.2.1 129 10/31/2023
4.2.0 449 10/24/2023
4.1.4 151 10/11/2023
4.1.3 132 10/10/2023
4.1.2 145 10/9/2023
4.1.1 256 9/28/2023
4.1.0 485 9/28/2023
4.0.0 278 9/28/2023
3.4.12 142 9/25/2023
3.4.11 138 9/25/2023
3.4.10 122 9/25/2023
3.4.9 133 9/24/2023
3.4.8 373 9/24/2023
3.4.7 142 9/24/2023
3.4.6 218 9/23/2023
3.4.5 132 9/23/2023
3.4.4 143 9/23/2023
3.4.3 121 9/22/2023
3.4.2 136 9/21/2023
3.4.1 268 6/2/2023
3.4.0 152 6/1/2023
3.3.18 157 5/31/2023
3.3.17 151 5/31/2023
3.3.16 154 5/31/2023
3.3.15 631 4/25/2023
3.3.14 185 4/24/2023
3.3.13 268 4/21/2023
3.3.12 177 4/17/2023
3.3.11 183 4/17/2023
3.3.10 177 4/17/2023
3.3.9 254 4/12/2023
3.3.8 187 4/12/2023
3.3.7 193 4/8/2023
3.3.6 641 4/3/2023
3.3.5 196 4/3/2023
3.3.4 287 4/2/2023
3.3.3 217 4/1/2023
3.3.2 215 4/1/2023
3.3.1 205 4/1/2023
3.3.0 1,189 3/29/2023
3.2.5 551 3/27/2023
3.2.4 293 3/26/2023
3.2.3 212 3/26/2023
3.2.2 216 3/26/2023
3.2.1 202 3/26/2023
3.2.0 907 3/26/2023
3.1.0 482 3/26/2023
3.0.1 217 3/25/2023
3.0.0 1,277 3/25/2023
2.5.2 1,089 3/24/2023
2.5.1 302 3/24/2023
2.5.0 309 3/23/2023
2.4.0 222 3/23/2023
2.3.1 230 3/23/2023
2.3.0 311 3/23/2023
2.2.0 209 3/22/2023
2.1.2 333 3/22/2023
2.1.1 396 3/22/2023
2.0.1 309 3/21/2023
2.0.0 258 3/21/2023
1.3.0 299 3/21/2023
1.2.0 271 3/21/2023
1.1.1 310 3/20/2023
1.1.0 287 3/20/2023
1.0.3 215 3/20/2023
1.0.2 243 3/19/2023
1.0.1 228 3/19/2023
1.0.0 228 3/19/2023
0.10.2 244 3/19/2023
0.10.1 202 3/19/2023
0.10.0 216 3/19/2023
0.9.0 226 3/19/2023
0.8.0 232 3/19/2023
0.7.3 229 3/19/2023
0.7.2 222 3/19/2023
0.7.1 221 3/19/2023
0.7.0 423 3/19/2023
0.6.0 277 3/19/2023
0.5.0 311 3/18/2023
0.4.1 226 3/18/2023
0.4.0 283 3/18/2023
0.3.0 235 3/18/2023
0.2.1 232 3/18/2023
0.2.0 236 3/18/2023
0.1.0 240 3/17/2023
0.0.1 245 3/17/2023