Skip to content

Configuration Reference

Complete reference for all DTDE configuration options.

Table of Contents


Service Configuration

Basic Setup

services.AddDbContext<AppDbContext>(options =>
{
    options.UseSqlServer(connectionString);
    options.UseDtde();  // Default configuration
});

Advanced Setup

services.AddDbContext<AppDbContext>(options =>
{
    options.UseSqlServer(connectionString);
    options.UseDtde(dtde =>
    {
        // Performance settings
        dtde.SetMaxParallelShards(10);

        // Debugging
        dtde.EnableDiagnostics();

        // Testing
        dtde.EnableTestMode();

        // Default temporal context
        dtde.SetDefaultTemporalContext(() => DateTime.UtcNow);

        // Shard definitions
        dtde.AddShard(s => s.WithId("shard1")...);
        dtde.AddShardsFromConfig("shards.json");
    });
});

DTDE Options

DtdeOptions Class

public sealed class DtdeOptions
{
    /// <summary>
    /// Gets the list of configured shards.
    /// </summary>
    public IList<IShardMetadata> Shards { get; }

    /// <summary>
    /// Gets or sets the default temporal context provider.
    /// </summary>
    public Func<DateTime>? DefaultTemporalContextProvider { get; set; }

    /// <summary>
    /// Gets or sets the maximum number of shards to query in parallel.
    /// Default: 10
    /// </summary>
    public int MaxParallelShards { get; set; }

    /// <summary>
    /// Gets or sets whether diagnostics are enabled.
    /// Default: false
    /// </summary>
    public bool EnableDiagnostics { get; set; }

    /// <summary>
    /// Gets or sets whether test mode is enabled.
    /// Default: false
    /// </summary>
    public bool EnableTestMode { get; set; }

    /// <summary>
    /// Gets or sets the metadata registry.
    /// </summary>
    public IMetadataRegistry MetadataRegistry { get; set; }

    /// <summary>
    /// Gets or sets the shard registry.
    /// </summary>
    public IShardRegistry ShardRegistry { get; set; }

    /// <summary>
    /// Gets or sets the temporal context.
    /// </summary>
    public ITemporalContext TemporalContext { get; set; }
}

Option Details

MaxParallelShards

Controls how many shards are queried simultaneously.

Value Behavior
1 Sequential execution
5-10 Balanced parallelism (recommended)
20+ High parallelism (CPU-intensive)
dtde.SetMaxParallelShards(10);

Considerations: - Higher values increase memory usage - Database connection pool limits apply - CPU cores affect optimal parallelism

EnableDiagnostics

Enables detailed logging of DTDE operations.

dtde.EnableDiagnostics();

Logged Information: - Shard resolution decisions - Query execution per shard - Timing information - Result merge operations

EnableTestMode

Disables sharding for testing purposes.

dtde.EnableTestMode();

Behavior: - All queries go to a single shard - Simplifies unit testing - Useful for development


Shard Configuration

Programmatic Configuration

Using Builder Pattern

dtde.AddShard(s => s
    .WithId("shard-eu")
    .WithName("European Data")
    .WithShardKeyValue("EU")
    .WithTable("Customers_EU", "dbo")
    .WithTier(ShardTier.Hot)
    .WithPriority(100));

Using Static Factory Methods

// Table shard
var tableShard = ShardMetadata.ForTable(
    shardId: "shard-2024",
    tableName: "Orders_2024",
    shardKeyValue: "2024",
    schemaName: "dbo");

// Database shard
var dbShard = ShardMetadata.ForDatabase(
    shardId: "shard-eu",
    name: "EU Database",
    connectionString: "Server=eu.db.com;...",
    shardKeyValue: "EU");

dtde.AddShard(tableShard);
dtde.AddShard(dbShard);

Shard Properties

Property Type Description Required
ShardId string Unique identifier Yes
Name string Display name Yes
StorageMode enum Tables or Databases Yes
TableName string Table name (table mode) Conditional
SchemaName string Schema name (default: "dbo") No
ConnectionString string Connection (database mode) Conditional
ShardKeyValue string Key value this shard handles No
DateRange DateRange Date range coverage No
KeyRange KeyRange Numeric key range No
Tier ShardTier Storage tier No
IsReadOnly bool Read-only flag No
Priority int Query priority (default: 100) No

Storage Tiers

public enum ShardTier
{
    Hot,        // Active data, SSD/fast storage
    Warm,       // Less active, standard storage
    Cold,       // Archived, slow storage
    Archive     // Long-term, cheapest storage
}

Use Cases:

Tier Example Use Storage Recommendation
Hot Current year data SSD, premium tier
Warm Last 1-2 years Standard SSD
Cold 3-5 years old HDD, standard tier
Archive 5+ years Archive storage

Entity Configuration

Sharding Configuration

Property-Based

modelBuilder.Entity<Customer>(entity =>
{
    entity.ShardBy(c => c.Region)
          .WithStorageMode(ShardStorageMode.Tables);
});

Hash-Based

modelBuilder.Entity<Customer>(entity =>
{
    entity.ShardByHash(c => c.Id, shardCount: 8)
          .WithStorageMode(ShardStorageMode.Tables);
});

Date-Based

modelBuilder.Entity<Order>(entity =>
{
    entity.ShardByDate(o => o.CreatedAt, DateShardInterval.Year)
          .WithStorageMode(ShardStorageMode.Tables);
});

Temporal Configuration

Basic Temporal

entity.HasTemporalValidity(
    validFrom: e => e.EffectiveDate,
    validTo: e => e.ExpirationDate);

With Versioning Mode

entity.HasTemporalValidity(e => e.ValidFrom, e => e.ValidTo)
      .WithVersioningMode(VersioningMode.SoftVersion);

With History Table

entity.HasTemporalValidity(e => e.ValidFrom, e => e.ValidTo)
      .WithVersioningMode(VersioningMode.AuditTrail)
      .WithHistoryTable("ContractHistory");

With Open-Ended Value

entity.HasTemporalValidity(e => e.ValidFrom, e => e.ValidTo)
      .WithOpenEndedValue(DateTime.MaxValue);

JSON Configuration

Shard Configuration File

Create shards.json:

{
  "shards": [
    {
      "shardId": "shard-2024-hot",
      "name": "2024 Active Data",
      "tableName": "Orders_2024",
      "schemaName": "dbo",
      "shardKeyValue": "2024",
      "tier": "Hot",
      "priority": 100,
      "isReadOnly": false,
      "dateRangeStart": "2024-01-01T00:00:00",
      "dateRangeEnd": "2024-12-31T23:59:59"
    },
    {
      "shardId": "shard-2023-warm",
      "name": "2023 Historical Data",
      "tableName": "Orders_2023",
      "schemaName": "dbo",
      "shardKeyValue": "2023",
      "tier": "Warm",
      "priority": 50,
      "isReadOnly": true,
      "dateRangeStart": "2023-01-01T00:00:00",
      "dateRangeEnd": "2023-12-31T23:59:59"
    }
  ]
}

Loading Configuration

options.UseDtde(dtde =>
{
    dtde.AddShardsFromConfig("shards.json");
});

Database Sharding JSON

{
  "shards": [
    {
      "shardId": "shard-eu",
      "name": "European Database",
      "connectionString": "Server=eu.sql.com;Database=App;...",
      "shardKeyValue": "EU",
      "tier": "Hot",
      "priority": 100
    },
    {
      "shardId": "shard-us",
      "name": "US Database",
      "connectionString": "Server=us.sql.com;Database=App;...",
      "shardKeyValue": "US",
      "tier": "Hot",
      "priority": 100
    }
  ]
}

JSON Schema Properties

Property Type Required Description
shardId string Yes Unique shard identifier
name string No Display name
tableName string No* Table name (table sharding)
schemaName string No Schema (default: "dbo")
connectionString string No* Connection (database sharding)
shardKeyValue string No Key value for routing
tier string No Hot, Warm, Cold, Archive
priority int No Query priority (default: 100)
isReadOnly bool No Read-only flag
dateRangeStart datetime No Start of date range
dateRangeEnd datetime No End of date range

*Either tableName or connectionString required based on storage mode.


Environment Variables

Connection String Override

var connectionString = Environment.GetEnvironmentVariable("DTDE_CONNECTION_STRING")
    ?? configuration.GetConnectionString("Default");

Shard Configuration Path

var shardConfigPath = Environment.GetEnvironmentVariable("DTDE_SHARD_CONFIG")
    ?? "shards.json";

dtde.AddShardsFromConfig(shardConfigPath);

Environment-Specific Configuration

// appsettings.Development.json
{
  "Dtde": {
    "MaxParallelShards": 4,
    "EnableDiagnostics": true
  }
}

// appsettings.Production.json
{
  "Dtde": {
    "MaxParallelShards": 20,
    "EnableDiagnostics": false
  }
}
var dtdeConfig = configuration.GetSection("Dtde");

options.UseDtde(dtde =>
{
    dtde.SetMaxParallelShards(dtdeConfig.GetValue<int>("MaxParallelShards", 10));

    if (dtdeConfig.GetValue<bool>("EnableDiagnostics"))
    {
        dtde.EnableDiagnostics();
    }
});

Configuration Validation

Startup Validation

DTDE validates configuration at startup:

// Throws if shard IDs are duplicated
dtde.AddShard(s => s.WithId("shard1")...);
dtde.AddShard(s => s.WithId("shard1")...); // Error!

// Throws if required properties missing
dtde.AddShard(s => s.WithTable("MyTable")); // Error: No ID

Runtime Validation

// Check shard exists before query
var shardExists = context.ShardRegistry.GetShard("my-shard") != null;

// Validate entity has sharding configured
var hasSharding = context.MetadataRegistry.GetEntityMetadata<Customer>()
    ?.ShardingConfiguration != null;

Complete Example

// Program.cs
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<AppDbContext>(options =>
{
    options.UseSqlServer(builder.Configuration.GetConnectionString("Default"));
    options.UseDtde(dtde =>
    {
        // Performance
        dtde.SetMaxParallelShards(
            builder.Configuration.GetValue<int>("Dtde:MaxParallelShards", 10));

        // Diagnostics (development only)
        if (builder.Environment.IsDevelopment())
        {
            dtde.EnableDiagnostics();
        }

        // Load shards from config
        var shardConfig = builder.Configuration.GetValue<string>("Dtde:ShardConfigPath");
        if (!string.IsNullOrEmpty(shardConfig))
        {
            dtde.AddShardsFromConfig(shardConfig);
        }

        // Programmatic shards
        dtde.AddShard(s => s
            .WithId("default")
            .WithTable("Entities", "dbo")
            .WithTier(ShardTier.Hot)
            .WithPriority(0));
    });
});

Next Steps


← Back to Wiki | Classes Reference →