EF Core provider · DuckDB · DuckLake · Parquet

DuckDB, DuckLake & Parquet,
Provider for .NET.

Write LINQ, SaveChanges, and migrations on EF Core 10 — while your data tiers from a hot DuckDB file out to hive-partitioned Parquet on S3, GCS, or Azure, or lives in a shared DuckLake catalog. One analytical read model, from laptop to cloud.

This is the provider LakeHold itself runs on. Everything documented here is exercised by a product in production, not only by its own test suite.

EF Core 10
Native provider, .NET 10
v1.17
Current release on NuGet
S3 · GCS · Azure
Verified archive paths
MIT
Licence, open source

Your EF Core workflow. DuckDB underneath.

Not an adapter or a query-only shim — a complete relational provider that speaks both fluent EF Core and analytical DuckDB.

01 — Native

Write familiar LINQ, get analytical SQL

Joins, grouping, ordering, aggregates, string, math, temporal, arrays, JSON traversal, and relational composition — all translated for DuckDB.

02 — Fast path

Load at columnar speed

Appender-backed BulkInsert reaches roughly one million rows per second, and primary-key Upsert stages an appender batch into a set-based merge.

03 — File native

Query files like tables

Map entities directly onto Parquet, CSV, or JSON — local or on object storage. Keep the data where it is and compose over it with LINQ.

04 — Complete

Reads and writes, no asterisk

SaveChanges, transactions, migrations, optimistic concurrency, scaffolding, and store-generated keys, on the native DuckDB profile.

05 — Toolable

Translate without executing

Capture exact SQL and parameters for queries and terminal aggregates, replay named commands unchanged, and inspect store-type support through public APIs.

One provider, three storage profiles

Start embedded, add a Parquet archive tier when history outgrows the file, or join a shared DuckLake catalog. Same package, same LINQ.

A — Embedded

DuckDB file

A complete relational provider over a local file: tracking, transactions, migrations, scaffolding, and analytical LINQ.

options.UseDuckDB("Data Source=app.duckdb")
C — Lakehouse

DuckLake catalog

Tracked writes, commit metadata, named-secret shares, and independent read-only contexts against a shared catalog. This is the profile LakeHold uses.

options.UseDuckLake("catalog/analytics.ducklake")

Hot data here, deep history anywhere

Archive whole relational aggregates — roots and their children together — to hive-partitioned Parquet, and keep reporting across the full history with ordinary LINQ.

Hot · writable

DuckDB file

Recent entities, relationships, SaveChanges, and Include.

Cold · columnar

Parquet archive

Named Hive partitions on disk, S3, GCS, R2, or Azure object storage.

Generated union views keep both tiers behind one LINQ read model. Ordinary property filters become partition predicates, so DuckDB opens only matching files — verified with DuckDB EXPLAIN file counts in the release suite.

Archivemove aggregate windows
Reconcilepublish late corrections
Restorebring history back hot
Compactrewrite full generations
Inspectinventory + preflight
Evolveverified contract rewrites

The right write path for every workload

Keep tracked, transactional writes when semantics matter. Switch to the appender-backed path when throughput does.

100,000 row insert — lower is betterIndicative
SaveChangesFull EF semantics
~12.5 s
BulkInsertAppender fast path
~90 ms

Measured on a developer laptop; run the included BenchmarkDotNet project on your own hardware. BulkInsert bypasses change tracking and store-generated values — use it when raw ingestion speed is the goal.

Strong fit

  • Reporting and dashboards
  • Embedded and edge analytics
  • ETL and local data pipelines
  • Long-retention time-series aggregates

Know the boundary

DuckDB is an embedded, single-writer analytical engine. It is not a drop-in system of record for high-concurrency, multi-instance transactional workloads.

See compatibility and limitations →

Provider documentation

Install, configure, and query

Backends and connection options, LINQ translation, non-executing command plans, write paths, file analytics, DuckLake, tiered storage, diagnostics, and the compatibility boundary.