{"id":27787969,"url":"https://github.com/doxense/foundationdb-dotnet-client","last_synced_at":"2025-04-30T16:53:07.172Z","repository":{"id":8826989,"uuid":"10527557","full_name":"Doxense/foundationdb-dotnet-client","owner":"Doxense","description":"C#/.NET Binding for FoundationDB Client API","archived":false,"fork":false,"pushed_at":"2025-04-30T12:46:50.000Z","size":20731,"stargazers_count":152,"open_issues_count":19,"forks_count":34,"subscribers_count":18,"default_branch":"master","last_synced_at":"2025-04-30T16:52:50.829Z","etag":null,"topics":["aspire","distributed-database","dotnet","dotnetcore","fdb","foundationdb","json","key-value-store"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Doxense.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2013-06-06T13:55:25.000Z","updated_at":"2025-04-30T12:46:54.000Z","dependencies_parsed_at":"2023-10-14T06:58:23.726Z","dependency_job_id":"d25e4060-1285-4937-bf3a-306f0aaeac7d","html_url":"https://github.com/Doxense/foundationdb-dotnet-client","commit_stats":null,"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Doxense%2Ffoundationdb-dotnet-client","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Doxense%2Ffoundationdb-dotnet-client/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Doxense%2Ffoundationdb-dotnet-client/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Doxense%2Ffoundationdb-dotnet-client/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Doxense","download_url":"https://codeload.github.com/Doxense/foundationdb-dotnet-client/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251748924,"owners_count":21637412,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aspire","distributed-database","dotnet","dotnetcore","fdb","foundationdb","json","key-value-store"],"created_at":"2025-04-30T16:53:04.652Z","updated_at":"2025-04-30T16:53:07.162Z","avatar_url":"https://github.com/Doxense.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"FoundationDB .NET Client\n=======================\n\nC#/.NET binding for the [FoundationDB](https://www.foundationdb.org/) client library.\n\n[![.NET Build](https://github.com/Doxense/foundationdb-dotnet-client/actions/workflows/dotnetcore.yml/badge.svg)](https://github.com/Doxense/foundationdb-dotnet-client/actions/workflows/dotnetcore.yml)\n\n# How to use\n\nYou will need to install two things:\n- A copy of the FoundationDB client library, available at https://github.com/apple/foundationdb/releases\n- A reference to the `FoundationDB.Client` package, and supporting packages.\n\nFor local development, using [.NET Aspire](https://learn.microsoft.com/en-us/dotnet/aspire/) will also make it easier to spin up a working environment in a few minutes using a locally hosted Docker container (requires [Docker Desktop](https://www.docker.com/products/docker-desktop/) on Windows)\n\n## Using Dependency Injection\n\nEven though it is possible to use the binding without dependency injection, it is very easy to register the `IFdbDatabaseProvider` service with the DI, and inject it into any controller, razor pages or any other service that will need to query the database.\n\nYou can either manually setup the services, in which case you will need to provide a valid set of settings (API level, root path, ...) as well as copy a valid `fdb.cluster` file so that the process can connect to an existing FoundationDB cluster.\n\nYou can also use .NET Aspire to automatically setup a local FoundationDB docker container, and automatically generate valid connection strings.\n\n### Manual configuration\n\nIn your Program.cs, you should register FoundationDB with the DI container:\n\n```CSharp\nusing FoundationDB.Client; // this is the main namespace of the library\n\nvar builder = WebApplication.CreateBuilder(args);\n\n// ...\n\n// hook-up the various FoundationDB types and interfaces with the DI container\n// You MUST select the appropriate API level that matches the target cluster (here '710' requires at least v7.1)\nbuilder.Services.AddFoundationDb(710, options =\u003e\n{\n    // auto-start the connection to the cluster on the first request\n    options.AutoStart = true; \n\n    //you can configure additional options here, like the path to the .cluster file, default timeouts, ...\n});\n\nvar app = builder.Build();\n\n// ...\n\n// note: you don't need to configure anything for this step\n\napp.Run();\n\n```\n\nThis will register an instance of the `IFdbDatabaseProvider` singleton, that you can then inject into other types.\n\nLet say, for example, that we have a `Books` Razor Page, that is reachable via the `/Books/{id}` route:\n\n- We first inject an instance of the `IFdbDatabaseProvider` via the constructor.\n- Inside the `OnGet(...)` action, we can call any of the `ReadAsync`, `ReadWriteAsync` or `WriteAsync` methods on this instance, to start a transaction retry-loop.\n- Inside the retry-loop, we get passed either an `IFdbReadOnlyTransaction` (read-only) or an `IFdbTransaction` (read-write).\n- We use this transaction to read the value of the `(\"Books\", \u003cid\u003e)` key from the database.\n  - Please DO NOT mutate any global state from within the transaction handler! The handler could be called MULTIPLE TIMES if there are any conflicts or retryable errors!\n  - Try to perform any pre-processing or post-processing OUTSIDE of the retry-loop. Remember, the transaction instance is only valid for 5 seconds!\n- After the retry-loop, we can inspect the result:\n  - if the key does not exist, then `GetAsync(...)` will return `Slice.Nil`.\n  - if the key does exist, then `GetAsync(...)` returns a Slice containing the bytes of the value (which are expected to be a JSON encoded document)\n- We de-serialize the JSON document into a `Book` record, that we can then pass to the Razor Template to be rendered into an HTML page.\n\n```c#\nnamespace MyWebApp.Pages\n{\n\n    using FoundationDB.Client;\n\n    /// \u003csummary\u003eRepresent a Book that will be stored (as JSON) into the database\u003c/summary\u003e\n    public sealed record Book\n    {\n        public required string Id { get; init; }\n\n        public required string Title { get; init; }\n\n        public required string ISBN { get; init; }\n\n        public required string AuthorId { get; init; }\n\n        // ...\n\n    }\n\n    /// \u003csummary\u003eThis page is used to display the details of a specific book\u003c/summary\u003e\n    /// \u003cremarks\u003eAccessible via the route '/Books/{id}'\u003c/remarks\u003e\n    public class BooksModel : PageModel\n    {\n\n        public BooksModel(IFdbDatabaseProvider db)\n        {\n            this.Db = db;\n        }\n\n        private IFdbDatabaseProvider Db { get; }\n\n        public Book Book { get; private set; }\n\n        public async Task OnGet(string id, CancellationToken ct)\n        {\n            // perform parameter validation, ACL checks, and any pre-processing here\n\n            // start a read-only retry-loop\n            Slice jsonBytes = await this.Db.ReadAsync((IFdbReadOnlyTransaction tr) =\u003e\n            {\n                // Read the value of the (\"Books\", \u003cID\u003e) key\n                Slice value = await tr.GetAsync(TuPack.Pack((\"Books\", id)));\n\n                // the transaction can be used to read additional keys and ranges,\n                // and has a lifetime of max. 5 secondes.\n\n                return value;\n            }, ct);\n\n            // here you can perform any post-processing of the result, outside of the retry-loop\n\n            // if the key does not exist in the database, GetAsync(...) will return Slice.Nil\n            if (jsonBytes.IsNull)\n            {\n                // This book does not exist, return a 404 page to the browser!\n                return NotFound();\n            }\n\n            // If the key exists, then GetAsync(...) will return its value as bytes, that can be deserialized\n            Book book = JsonSerializer.Deserialize\u003cBook\u003e(jsonBytes.Span);\n\n            // perform any checks and validation here, like converting the Model (from the database) into a ViewModel (for the razor template)\n\n            this.Book = book;\n        }\n    }\n}\n```\n\n### Using Aspire\n\nIt is possible to add a FoundationDB cluster resource to your Aspire application model, and pass a reference to this cluster to the projects that need it.\n\nFor local development, a local FoundationDB node will be started using the `foundationdb/foundationdb` Docker image, and all projects that use the cluster reference will have a temporary Cluster file pointing to the local instance.\n\nNote: you will need to install Docker on your development machine, as explained in https://learn.microsoft.com/en-us/dotnet/aspire/get-started/add-aspire-existing-app#prerequisites\n\nIn the Program.cs of you AppHost project:\n```c#\nprivate static void Main(string[] args)\n{\n    var builder = DistributedApplication.CreateBuilder(args);\n\n    // Define a locally hosted FoundationDB cluster\n    var fdb = builder\n        .AddFoundationDb(\"fdb\", apiVersion: 720, root: \"/Sandbox/MySuperApp\", clusterVersion: \"7.2.5\", rollForward: FdbVersionPolicy.Exact);\n\n    // Project that needs a reference to this cluster\n    var backend = builder\n        .AddProject\u003cProjects.AwesomeWebApiBackend\u003e(\"backend\")\n        //...\n        .WithReference(fdb); // register the fdb cluster connection\n\n    // ...\n}\n```\n\nNote: A FoundationDB node will be available on port 4550, while the Aspire Host is running, and can be reached with the `docker:docker@127.0.0.1:4550` connection string.\n\nOn the very first start, the cluster will be unavailable until a `create single ssd` command is executed. The most simple solution is to use `Docker Desktop` to execute a command in the running docker image. Simply run `fdbcli` from within the docker container. Once this is done, you should stop and restart the Aspire host.\n\nFor testing/staging/production, or \"non local\" development, it is also possible to configure a FoundationDB connection resource that will pass the specified Cluster file to the projects that reference the cluster resource.\n\nIn the Program.cs of your AppHost project:\n```c#\nprivate static void Main(string[] args)\n{\n    var builder = DistributedApplication.CreateBuilder(args);\n\n    // Define an external FoundationDB cluster connection\n    var fdb = builder\n        .AddFoundationDbCluster(\"fdb\", apiVersion: 720, root: \"/Sandbox/MySuperApp\", clusterFile: \"/SOME/PATH/TO/testing.cluster\")\t\t;\n\n    // Project that needs a reference to this cluster\n    var backend = builder\n        .AddProject\u003cProjects.AwesomeWebApiBackend\u003e(\"backend\")\n        //...\n        .WithReference(fdb); // register the fdb cluster connection\n\n    // ...\n}\n```\n\nThen, in the Program.cs, or where you are declaring your services with the DI, use the following extension method to add support for FoundationDB:\n\n```c#\nvar builder = WebApplication.CreateBuilder(args);\n\n// setup Aspire services...\nbuilder.AddServiceDefaults();\n//...\n\n// hookup the FoundationDB component\nbuilder.AddFoundationDb(\"fdb\"); // \"fdb\" is the same name we used in AddFoundationDb(...) or AddFoundationDbCLuster(...) in the AppHost above.\n\n// ...rest of the startup logic....\n```\n\nThis will automatically register an instance of the `IFdbDatabaseProvider` service, automatically configured to connect the FDB local or external cluster defined in the AppHost.\n\n## Using the Directory Layer\n\nPlease note that in real use case, it is highly encourage to use the Directory Layer to generate a prefix for the keys, instead of simply using the `(\"Books\", ...)` prefix.\n\nIn your startup logic:\n```c#\n\npublic sealed class BookOptions\n{\n\n    /// \u003csummary\u003ePath to the root directory subspace of the application where all data will be stored\u003c/summary\u003e\n    public FdbPath Location { get; set; } // ex: \"/Tenants/ACME/MyApp/v1\"\n\n}\n\n// ...\n\nbuilder.Services.Configure\u003cBookOptions\u003e(options =\u003e\n{\n    // note: this would be read from your configuration!\n    options.Location = FdbPath.Relative(\"Tenants\", \"ACME\", \"MyApp\", \"v1\");\n});\n\n```\n\nIn your Razor Page:\n\n```c#\npublic class BooksModel : PageModel\n{\n\n    public BooksModel(IOptions\u003cBookOptions\u003e options, IFdbDatabaseProvider db)\n    {\n        this.Options = options;\n        this.Db = db;\n    }\n\n    private IFdbDatabaseProvider Db { get; }\n\n    private IOptions\u003cBookOptions\u003e Options { get; }\n\n    public async Task OnGet(string id, CancellationToken ct)\n    {\n        Slice jsonBytes = await this.Db.ReadAsync((IFdbReadOnlyTransaction tr) =\u003e\n        {\n            // get the location that corresponds to this path\n            var location = this.Db.Root[this.Options.Value.Location];\n\n            // \"resolve\" this location into a Directory Subspace that will add the matching prefix to our keys\n            var subspace = await location.Resolve(tr);\n\n            // use this subspace to generate our keys\n            Slice value = await tr.GetAsync(subspace.Encode(\"Books\", id));\n\n            // ....\n\n        }\n\n        // ...\n\n    }\n\n}\n```\n\n## Access the underlying `IFdbDatabase` singleton\n\nThe `IFdbDatabaseProvider` also has a `GetDatabase(...)` method that can be used to obtain an instance of the `IFdbDatabase` singleton, that can then be used directly, or passed to any other Layer or library.\n\n```c#\npublic class FooBarModel : PageModel\n{\n\n    public FooBarModel(IFdbDatabaseProvider db, IFooBarLayer layer)\n    {\n        this.Db = db;\n        this.Layer = layer;\n    }\n\n    private IFdbDatabaseProvider Db { get; }\n\n    private IFooBarLayer Layer { get; }\n\n    public List\u003cFoo\u003e Results { get; }\n\n    public async Task OnGet(...., CancellationToken ct)\n    {\n        // get an instance of the database singleton\n        var db = await this.Db.GetDatabase(ct);\n        // notes:\n        // - if AutoStart is false, this will throw an exception if the provider has not been started manually during starting.\n        // - if AutoStart is true, the very first call will automatically start the connection.\n        // - Once the connection has been established, calls to GetDatabase will return an already-completed task with a cached singleton (or exception).\n\n        // call some method on this layer, that will perform a query on the database and return a list of results\n        this.Results = await this.Layer.Query(db, ...., ct);\n    }\n\n}\n```\n\n# Deployment\n\n## Docker containers\n\nThe easiest way to deploy is to use one of the [ASP.NET Core Runtime docker images](https://hub.docker.com/r/microsoft/dotnet-aspnet/) provided my microsoft, such as `mcr.microsoft.com/dotnet/aspnet:8.0` or newer.\n\nIn order to function, the FoundationDB Native client library (`fdb_c.dll` on Windows, `libfdb_c.so`) needs to be present in the container image. The easiest way is to simply copy them from the [FoundationDB Docker image](https://hub.docker.com/r/foundationdb/foundationdb) that contains these files.\n\nExample of a `Dockerfile` that will grab v7.3.x binaries and inject them into you application container:\n\n```Dockerfile\n# Version of the FoundationDB Client Library\nARG FDB_VERSION=7.3.38\n\n# We will need the official fdb docker image to obtain the client binaries\nFROM foundationdb/foundationdb:${FDB_VERSION} as fdb\n\nFROM mcr.microsoft.com/dotnet/aspnet:7.0\n\n# copy the binary from the official fdb image into our target image.\nCOPY --from=fdb /usr/lib/libfdb_c.so /usr/lib\n\nWORKDIR /App\n\nCOPY . /App\n\nENTRYPOINT [\"dotnet\", \"MyWebApp.dll\"]\n```\n\n## Manual deployment\n\nThe easiest solution is to install the `foundationdb-clients-X.Y.Z` packages from `https://apple.github.io/foundationdb/downloads.html`. Only the client packages should be installed, unless you also intend to run the cluster locally.\n\nIf you are manually copying your application files to the destination, either by unzip into a folder, or using a single-exe deployment, it is still necessary to also copy the `fdb_c.dll` or `libfdb_c.so` binaries to the destination\n\nIf, for any reason, you cannot copy the client binary to the default platform location (ex: `/usr/lib` on Linux), you can specify the full path to the library by settings the `NativeLibraryPath` option, or setting the `Aspire:FoundationDb:Client:NativeLibraryPath` key in the `appSettings.json` file (see the `FdbClientSettings` class other available settings).\n\nIf you need to troubleshoot the connection to the FoundationDB cluster, from the point of view of your application, it is also recommended to install `fdbcli` (comes with the `foundationdb-clients` package, needs to be manually deployed if not).\n\n# How to build\n\n## Visual Studio Solution\n\nYou will need Visual Studio 2022 version 17.12 or above to build the solution (C# 13 and .NET 9.0 support is required).\n\n### From the Command Line\n\nYou can also build, test and compile the NuGet packages from the command line using the `dotnet` CLI:\n\n- `dotnet build` to build (in DEBUG) all the projects in the solution\n- `dotnet test` to run the unit tests (requires a working local FoundationDB cluster).\n\n### As a sub-module\n\nMost projects in this repository are targeting multiple frameworks, meaning that each project will be build several times, one for each target.\n\nWhen consuming this repository as a sub-module inside another repository, all the included projects will still want to build for all these targets, even if your parent solution only targets one framework (or a different subset).\n\nThis can also cause issues if you application is targeting an older .NET runtime and SDK (for example `net9.0` using the .NET 9.0.x SDK), which do not support more recent targets from this repo (ex: `net10.0`).\n\nBy default, the `Directory.Build.props` will attempt to detect when it is inside a git sub-module, and import any `Directory.Build.props` in the parent directory.\n_note: Some CI build environments may checkout sub-module in non-standard way. If this happens, you can set the environment variable `FDB_BUILD_PROPS_OVERRIDE` to `1` in order to bypass the check._\n\nThis parent props file can then override a series of msbuild variables that are injected in the `TargetFrameworks` property of all `.csproj` in this repo:\n- `CoreSdkVersions`: overrides the value of all the other variables at once. Use this is you are single-targeting.\n\nIf you are multi-targeting and need more fine grained precision, you can use the following variables:\n- `CoreSdkRuntimeVersions`: targets for all the core libraries (FoundationDB.Client.dll, ...) that are redistributed\n- `CoreSdkToolsVersions`: targets for all the tools and executables (FdbShell, FdbTop, ...) that are redistributed\n- `CoreSdkUtilityVersions`: targets for all the internal tools and executables that are only used for building, testing, and are not expected to be redistributed.\n- `CloudSdkRuntimeVersions`: targets for all libraries that reference .NET Aspire (which is only supports .NET 8 or later).\n\nIf you parent repository is also multi-targeting, you can specify several targets, like for example `net9.0;net10.0`. Please note that is you target a more recent framework that is not supported by this repo, they may fail to build properly!\n\nAn example of a parent `Directory.Build.props` that overrides the build to only target `net9.0`:\n```xml\n\u003cProject\u003e\n\t\u003cPropertyGroup\u003e\n\n\t\t\u003c!-- Force all projects in the FoundationDB sub-module to target net9.0 --\u003e\n\t\t\u003cCoreSdkVersions\u003enet9.0\u003c/CoreSdkVersions\u003e\n\n\t\u003c/PropertyGroup\u003e\n\u003c/Project\u003e\n```\n\nAn example of a parent `Directory.Build.props` that multi-targets `net9.0` and `net10.0`, but only want to build the tools for `net10.0`:\n```xml\n\u003cProject\u003e\n\t\u003cPropertyGroup\u003e\n\n\t\t\u003c!-- If you are using FoundationDB.Client, Doxense.Core, etc... --\u003e\n\t\t\u003cCoreSdkRuntimeVersions\u003enet9.0;net10.0\u003c/CoreSdkRuntimeVersions\u003e\n\n\t\t\u003c!-- If you are using the FoundationDB .NET Aspire Integration --\u003e\n\t\t\u003cCloudSdkRuntimeVersions\u003enet9.0;net10.0\u003c/CloudSdkRuntimeVersions\u003e\n\n\t\t\u003c!-- If you are using any of the tools (FdbShell, FdbTop) --\u003e\n\t\t\u003cCoreSdkToolsVersions\u003enet10.0\u003c/CoreSdkToolsVersions\u003e\n\n\t\u003c/PropertyGroup\u003e\n\u003c/Project\u003e\n```\n\n# How to test\n\nThe test projects are using NUnit 4, and the test running must run as a 64-bit process (32-bit is not supported).\n\n\u003e In order to run the tests, you will also need to obtain the 'fdb_c.dll'/`libfdb_c.so` native library.\n\nYou can either run the tests from Visual Studio or Visual Studio Code, using any extension (like Resharper), or from the command line via `dotnet test`.\n\n\u003e WARNING: All the tests try to run in a dedicated subspace, but there is a possibility of data corruption if they are running against a test or staging cluster! You should run the test against a local cluster where all the data is considered expandable!\n\n# Implementation Notes\n\nPlease refer to https://apple.github.io/foundationdb/ to get an overview on the FoundationDB API, if you haven't already.\n\nThis .NET binding has been modeled to be as close as possible to the other bindings (Python especially), while still having a '.NET' style API. \n\nThere were a few design goals, that you may agree with or not:\n* Reducing the need to allocate `byte[]` as much as possible. To achieve that, I'm using a `Slice` struct that is the logical equivalent of `ReadOnlyMemory\u003cbyte\u003e`, but more versatile.\n* Mapping FoundationDB's Future into `Task\u003cT\u003e` to be able to use async/await. \n* Reducing the risks of memory leaks in long running server processes by wrapping all FDB_xxx handles with .NET `SafeHandle`. This adds a little overhead when P/Invoking into native code, but will guarantee that all handles get released at some time (during the next GC).\n* The Tuple layer has also been optimized to reduce the number of allocations required, and cache the packed bytes of oftenly used tuples (in subspaces, for example).\n\nHowever, there are some key differences between Python and .NET that may cause problems:\n* Python's dynamic types and auto casting of Tuples values, are difficult to model in .NET (without relying on the DLR). The Tuple implementation try to be as dynamic as possible, but if you want to be safe, please try to only use strings, longs, booleans and byte[] to be 100% compatible with other bindings. You should refrain from using the untyped `tuple[index]` indexer (that returns an object), and instead use the generic `tuple.Get\u003cT\u003e(index)` that will try to adapt the underlying type into a T.\n* The Tuple layer uses ASCII and Unicode strings, while .NET only have Unicode strings. That means that all strings in .NET will be packed with prefix type 0x02 and byte arrays with prefix type 0x01. An ASCII string packed in Python will be seen as a byte[] unless you use `ITuple.Get\u003cstring\u003e()` that will automatically convert it to Unicode.\n* There is no dedicated 'UUID' type prefix, so that means that System.Guid would be serialized as byte arrays, and all instances of byte 0 would need to be escaped. Since `System.Guid` are frequently used as primary keys, I added a new custom type prefix (0x30) for 128-bits UUIDs and (0x31) for 64-bits UUIDs. This simplifies packing/unpacking and speeds up writing/reading/comparing Guid keys.\n\nThe following files will be required by your application\n* `FoundationDB.Client.dll` : Contains the core types (FdbDatabase, FdbTransaction, ...) and infrastructure to connect to a FoundationDB cluster and execute basic queries, as well as the Tuple and Subspace layers.\n* `FoundationDB.Layers.Commmon.dll` : Contains common Layers that emulates Tables, Indexes, Document Collections, Blobs, ...\n* `fdb_c.dll`/`libfdb_c.so` : The native C client that you will need to obtain from the official FoundationDB windows setup or linux client packages.\n\n# Known Limitations\n\n* Since the native FoundationDB client is 64-bit only, this .NET library is also for 64-bit only applications! Even though it targets AnyCPU, it would fail at runtime. _Don't forget to disable the `Prefer 32-bit` option in your project Build properties, that is enabled by default!_ \n* You cannot unload the fdb C native client from the process once the network thread has started. You can stop the network thread once, but it does not support being restarted. This can cause problems when running under ASP.NET.\n* FoundationDB does not support long running batch or range queries if they take too much time. Such queries will fail with a 'past_version' error. The current maximum duration for read transactions is 5 seconds.\n* FoundationDB has a maximum allowed size of 100,000 bytes for values, and 10,000 bytes for keys. Larger values must be split into multiple keys\n* FoundationDB has a maximum allowed size of 10,000,000 bytes for writes per transactions (some of all key+values that are mutated). You need multiple transaction if you need to store more data. There is a Bulk API (`Fdb.Bulk.*`) to help for the most common cases (import, export, backup/restore, ...)\n* See https://apple.github.io/foundationdb/known-limitations.html for other known limitations of the FoundationDB database.\n\n# License\n\nThis code is licensed under the 3-clause BSD License.\n\n# Contributing\n\n* Yes, we use tabs! Get over it.\n* Style rules are encoded in `.editorconfig` which is supported by most IDEs (or via extensions).\n* You can visit the FoundationDB forums for generic questions (not .NET): https://forums.foundationdb.org/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdoxense%2Ffoundationdb-dotnet-client","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdoxense%2Ffoundationdb-dotnet-client","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdoxense%2Ffoundationdb-dotnet-client/lists"}