TableStorage.Fluent
6.0.0-preview-02
dotnet add package TableStorage.Fluent --version 6.0.0-preview-02
NuGet\Install-Package TableStorage.Fluent -Version 6.0.0-preview-02
<PackageReference Include="TableStorage.Fluent" Version="6.0.0-preview-02" />
<PackageVersion Include="TableStorage.Fluent" Version="6.0.0-preview-02" />
<PackageReference Include="TableStorage.Fluent" />
paket add TableStorage.Fluent --version 6.0.0-preview-02
#r "nuget: TableStorage.Fluent, 6.0.0-preview-02"
#:package TableStorage.Fluent@6.0.0-preview-02
#addin nuget:?package=TableStorage.Fluent&version=6.0.0-preview-02&prerelease
#tool nuget:?package=TableStorage.Fluent&version=6.0.0-preview-02&prerelease
TableStorage.Fluent
Provides fluent entity types for storing multiple entity types in a single Azure Table Storage table. This package enables polymorphic table storage by allowing you to store different entity types in the same table using a discriminator pattern.
This package supports 2 to 4 generic type parameters. For support of 5 to 16 generic type parameters, see TableStorage.Fluent.Extended.
Features
- Store multiple entity types in a single table
- Type-safe discriminated union entities
- Support for 2 to 4 different entity types per table
- Three discriminator strategies:
$type,PartitionKey, andRowKey - Implicit conversion operators for seamless type handling
- Pattern matching with
SwitchCaseandSwitchCaseOrDefaultmethods
Installation
dotnet add package TableStorage.Core
dotnet add package TableStorage
dotnet add package TableStorage.Fluent
Usage
Basic Fluent Entity
Define your entity types using the standard [TableSet] attribute:
[TableSet]
public partial class Customer
{
public string Name { get; set; }
public string Email { get; set; }
}
[TableSet]
public partial class Order
{
public string OrderNumber { get; set; }
public decimal Amount { get; set; }
}
Create a table that can store both types using FluentTableEntity<T1, T2>:
[TableContext]
public partial class MyTableContext
{
public TableSet<FluentTableEntity<Customer, Order>> MixedEntities { get; set; }
}
Working with Fluent Entities
Store entities using implicit conversion:
var customer = new Customer { Name = "John Doe", Email = "john@example.com" };
FluentTableEntity<Customer, Order> fluentEntity = customer; // Implicit conversion
await context.MixedEntities.AddEntityAsync(fluentEntity);
Retrieve and work with entities:
var entity = await context.MixedEntities.GetEntityOrDefaultAsync(partitionKey, rowKey);
// Check the backing type
var backingType = entity.GetBackingType(); // Returns FluentBackingType.First or Second
// Get the actual type
var actualType = entity.GetActualType(); // Returns typeof(Customer) or typeof(Order)
// Pattern matching with SwitchCase
var result = entity.SwitchCase(
case1: customer => $"Customer: {customer.Name}",
case2: order => $"Order: {order.OrderNumber}"
);
Discriminator Strategies
1. FluentTableEntity<T1, T2> - Uses $type discriminator
The default fluent entity adds a $type property to distinguish between entity types:
public TableSet<FluentTableEntity<Customer, Order>> Entities { get; set; }
2. FluentPartitionTableEntity<T1, T2> - Uses PartitionKey as discriminator
Uses the PartitionKey to determine the entity type. The partition key will be set to the type name:
public TableSet<FluentPartitionTableEntity<Customer, Order>> Entities { get; set; }
3. FluentRowTypeTableEntity<T1, T2> - Uses RowKey as discriminator
Uses the RowKey to determine the entity type. The row key will be set to the type name:
public TableSet<FluentRowTypeTableEntity<Customer, Order>> Entities { get; set; }
Multiple Entity Types
Fluent entities support up to 16 different types. Simply add more type parameters:
public TableSet<FluentTableEntity<Type1, Type2, Type3, Type4, Type5>> MultiTypeTable { get; set; }
Safe Type Extraction
Use SwitchCaseOrDefault for safe handling when you're not sure which type is stored:
var value = entity.SwitchCaseOrDefault(
case1: customer => ProcessCustomer(customer),
case2: order => ProcessOrder(order),
defaultCase: () => "Unknown type"
);
Directly get the underlying value:
var value = entity.GetValue(); // Throws if NotInitialized
var valueOrNull = entity.GetValueOrDefault(); // Returns null if NotInitialized
Implicit Conversions
Fluent entities support implicit conversions in both directions:
// To FluentTableEntity
Customer customer = new Customer { Name = "Jane" };
FluentTableEntity<Customer, Order> fluent = customer;
// From FluentTableEntity
Customer retrievedCustomer = fluent; // Implicit cast
Advanced Scenarios
Querying Mixed Entity Tables
You can query fluent entity tables using standard LINQ operations:
await foreach (var entity in context.MixedEntities)
{
var type = entity.GetBackingType();
switch (type)
{
case FluentBackingType.First:
Customer customer = entity;
Console.WriteLine($"Customer: {customer.Name}");
break;
case FluentBackingType.Second:
Order order = entity;
Console.WriteLine($"Order: {order.OrderNumber}");
break;
}
}
Use Cases
Fluent entities are ideal for scenarios where:
- You need to store related but different entity types in a single table for efficient partitioning
- You want to maintain a unified query interface across multiple entity types
- You need polymorphic storage without creating separate tables
- You're implementing event sourcing or activity streams with multiple event types
Related Packages
- TableStorage.Fluent.Extended - Extended support for 5 to 16 generic type parameters
- TableStorage
- TableStorage.Core
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. 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. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. 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. |
| .NET Core | netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.1 is compatible. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.1
- TableStorage (>= 6.0.0-preview.1 && < 7.0.0)
NuGet packages (2)
Showing the top 2 NuGet packages that depend on TableStorage.Fluent:
| Package | Downloads |
|---|---|
|
TableStorage.Fluent.Extended
Package Description |
|
|
TableStorage.Fluent.RuntimeCompilations
Package Description |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 6.0.0-preview-02 | 32 | 1/9/2026 |
| 6.0.0-preview-01 | 38 | 1/8/2026 |