Altruist UORM
Unified Object-Relational Mapping (UORM) system designed for seamless data management. It abstracts different persistance providers and offers a flexible, extensible approach for working with persistent data.
Database Providers
The framework supports multiple database providers under a common interface:
ILinqDatabaseProvider
– Designed for Entity Framework Core and relational databases.ICqlDatabaseProvider
– Optimized for Cassandra-based databases like ScyllaDB.
Note:
You don't need to interact with these providers directly unless you're implementing a custom provider.
ORM Model
Altruist provides its own ORM model to maintain consistency across different persistance providers.
TableAttribute
Table Definition: Defines a stored entity. It includes:
- Name: The entity name.
- StoreHistory: If
true
, all updates are stored, useful for historical records like autosaves.
Note:
StoreHistory has no effect on caching
[Vault("game_state", StoreHistory = true)]
public class GameState {
}
Controlling Historical Storage
If a table is marked with StoreHistory = true
, you can choose when to store data historically by passing an extra parameter when saving:
await vault.SaveAsync(gameState, storeHistory: true);
This allows fine-grained control over historical storage, preventing unnecessary data accumulation while still enabling selective snapshots.
Note:
Avoid enabling / saving history on frequently updated tables, as it can significantly increase unnecessary storage usage.
PrimaryKeyAttribute
(Only DB)
Primary Key: Marks one or more properties as primary keys.
[PrimaryKey("Id")]
public class Player { }
ColumnIndexAttribute
(Only DB)
Indexed Columns: Marks a property as indexed for faster lookups.
[ColumnIndex]
public int Level { get; set; }
IgnoreAttribute
Ignored Properties: Excludes a property from being stored in the database.
[Ignore]
public string TemporaryData { get; set; }
SortingByAttribute
(Only DB)
Sorting: Automatically sorts queries by a specific column, useful for historical tables.
[SortingBy("SaveTime", Ascending: false)]
public class GameSave { }
ColumnAttribute
Explicit Columns: Explicitly marks a property as a table column. The name can be overridden.
[Column("player_name")]
public string Name { get; set; }
Vault System: Querying and Saving Data
Altruist provides a Vault System, which acts as an API for querying and managing database tables.
Keyspaces: Organizing Tables
A Keyspace
is similar to a database schema
. By default, the keyspace is altruist
.
To define a custom keyspace:
public class MyScyllaKeyspace : ScyllaKeyspace
{
public override string Name { get; } = "mykeyspace";
}
Registering a Keyspace and Vault
During the database setup phase, register the keyspace and define which tables (vaults) belong to it.
.WithScyllaDB(setup => {
return setup
.AddContactPoint("localhost", 9042)
.CreateKeyspace<MyScyllaKeyspace>(setup =>
setup.ForgeVaults()
);
});
Using the Vault Repository
To interact with stored data, use IVaultRepository
, which provides LINQ-like query capabilities.
IVaultRepository<MyScyllaKeyspace> vaultRepo;
Querying a Table (Vault)
var playerVault = vaultRepo.Select<Player>();
var players = await playerVault.Where(p => p.Level > 10).ToListAsync();
Note:
The Vault System only works with database providers (ILinqDatabaseProvider
, ICqlDatabaseProvider
) and does not support cache providers like Redis.