Sylin.Koan.Data.Cutover
1.0.44
dotnet add package Sylin.Koan.Data.Cutover --version 1.0.44
NuGet\Install-Package Sylin.Koan.Data.Cutover -Version 1.0.44
<PackageReference Include="Sylin.Koan.Data.Cutover" Version="1.0.44" />
<PackageVersion Include="Sylin.Koan.Data.Cutover" Version="1.0.44" />
<PackageReference Include="Sylin.Koan.Data.Cutover" />
paket add Sylin.Koan.Data.Cutover --version 1.0.44
#r "nuget: Sylin.Koan.Data.Cutover, 1.0.44"
#:package Sylin.Koan.Data.Cutover@1.0.44
#addin nuget:?package=Sylin.Koan.Data.Cutover&version=1.0.44
#tool nuget:?package=Sylin.Koan.Data.Cutover&version=1.0.44
Sylin.Koan.Data.Cutover
Use this package for one deliberate operational move: copy the active default Entity database into a new, empty
configured source, verify exact logical readback, and atomically make that source the host's new default. SQLite,
MongoDB, and PostgreSQL are the first graduated providers, including moves between them. The package is discovered by
AddKoan(); there is no manual registrar.
Install
dotnet add package Sylin.Koan.Data.Cutover
Requirements
This supported envelope is intentionally narrow. It requires one host, no external writers during the run, graduated
SQLite, MongoDB, or PostgreSQL routes, string-keyed default-routed Entity roots, a Managed + ReadWrite empty target, and no
segmentation, managed fields, stored transforms, custom read filters, delete overrides, or compatibility mappings on
the included roots. Plan() reports a stable blocker and correction for anything outside that envelope.
Configure two physically distinct sources and keep the configured Default source unchanged:
{
"Koan": {
"Data": {
"Sources": {
"Default": {
"Adapter": "sqlite",
"ConnectionString": "Data Source=./data/current.db"
},
"Mongo": {
"Adapter": "mongo",
"ConnectionString": "mongodb://localhost:27017",
"Database": "app_next",
"StorageLifecycle": "Managed",
"Access": "ReadWrite"
},
"Postgres": {
"Adapter": "postgres",
"ConnectionString": "Host=localhost;Database=app_next;Username=app;Password=...",
"StorageLifecycle": "Managed",
"Access": "ReadWrite"
}
},
"Cutover": {
"WriterOwnership": "HostExclusiveOrExternallyQuiesced"
}
}
}
}
Usage
Assert writer ownership only when no process can write either database outside this host's Koan Data paths. Then plan and run the transition:
using Koan.Data.Core;
using Koan.Data.Cutover;
var transition = Data.Source("Mongo").PromoteToDefault();
var plan = await transition.Plan(ct);
if (!plan.CanRun)
{
foreach (var blocker in plan.Blockers)
logger.LogError("{Code}: {Reason} Correction: {Correction}",
blocker.Code, blocker.Reason, blocker.Correction);
return;
}
var receipt = await transition.Run(ct);
// A later verified move uses exactly the same application language.
var postgresReceipt = await Data.Source("Postgres").PromoteToDefault().Run(ct);
Use the verified default-route cutover how-to for the complete maintenance-window checklist, blocker handling, durable-state preservation, and quarantine recovery procedure.
Guarantees and boundaries
The active pointer is persisted outside both databases at .Koan/data/active-route.json beneath the host content root;
override it with Koan:Data:Route:StatePath. Preserve that file with the deployment. After activation, unqualified
Entity and Direct calls use the target, retained default-derived repositories fail as stale, and explicit
EntityContext.Source("Default") access still addresses the old configured source. Koan never performs an automatic
rollback.
A failed run leaves the old default active. Once target mutation could have begun, the target is durably quarantined and normal Data access rejects it until an operator empties or reprovisions it and a later verified run succeeds. See TECHNICAL.md and DATA-0111 for the complete internal and architecture contracts.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. 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. |
-
net10.0
- Microsoft.Extensions.Configuration (>= 10.0.10)
- Microsoft.Extensions.Configuration.Abstractions (>= 10.0.10)
- Microsoft.Extensions.Configuration.Binder (>= 10.0.10)
- Microsoft.Extensions.Configuration.EnvironmentVariables (>= 10.0.10)
- Microsoft.Extensions.Configuration.Json (>= 10.0.10)
- Microsoft.Extensions.DependencyInjection (>= 10.0.10)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.10)
- Microsoft.Extensions.Hosting (>= 10.0.10)
- Microsoft.Extensions.Hosting.Abstractions (>= 10.0.10)
- Microsoft.Extensions.Logging (>= 10.0.10)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.10)
- Microsoft.Extensions.Logging.Console (>= 10.0.10)
- Microsoft.Extensions.Options (>= 10.0.10)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 10.0.10)
- Microsoft.Extensions.Options.DataAnnotations (>= 10.0.10)
- Newtonsoft.Json (>= 13.0.4)
- Sylin.Koan.Core (>= 1.0.39 && < 2.0.0)
- Sylin.Koan.Data.Abstractions (>= 1.0.41 && < 2.0.0)
- Sylin.Koan.Data.Core (>= 1.0.73 && < 2.0.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.0.44 | 121 | 9/13/2026 |
| 1.0.42 | 100 | 9/12/2026 |
| 1.0.40 | 96 | 9/12/2026 |
| 1.0.39 | 108 | 9/10/2026 |
| 1.0.36 | 108 | 9/10/2026 |
| 1.0.33 | 92 | 9/9/2026 |
| 1.0.30 | 97 | 9/9/2026 |
| 1.0.28 | 97 | 9/9/2026 |
| 1.0.24 | 97 | 9/9/2026 |
| 1.0.23 | 106 | 9/9/2026 |
| 1.0.19 | 112 | 9/5/2026 |
| 1.0.18 | 122 | 8/30/2026 |
| 1.0.17 | 104 | 8/30/2026 |
| 1.0.16 | 109 | 8/28/2026 |
| 1.0.15 | 110 | 8/28/2026 |
| 1.0.14 | 108 | 8/28/2026 |
| 1.0.13 | 99 | 8/28/2026 |
| 1.0.12 | 103 | 8/28/2026 |
| 1.0.11 | 119 | 8/27/2026 |
| 1.0.7 | 119 | 8/25/2026 |