{"id":31788302,"url":"https://github.com/altasoft/storm","last_synced_at":"2026-01-29T19:04:29.986Z","repository":{"id":316717757,"uuid":"1064133902","full_name":"altasoft/Storm","owner":"altasoft","description":"AltaSoft.Storm- A Sleek and Efficient ORM Solution for C#","archived":false,"fork":false,"pushed_at":"2026-01-10T16:20:21.000Z","size":6265,"stargazers_count":8,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-11T04:49:59.537Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/altasoft.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-25T15:32:35.000Z","updated_at":"2025-12-18T15:42:07.000Z","dependencies_parsed_at":"2025-10-28T18:01:23.569Z","dependency_job_id":"5394d46c-dfc3-4c59-8260-9aea0fad012d","html_url":"https://github.com/altasoft/Storm","commit_stats":null,"previous_names":["altasoft/storm"],"tags_count":24,"template":false,"template_full_name":null,"purl":"pkg:github/altasoft/Storm","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/altasoft%2FStorm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/altasoft%2FStorm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/altasoft%2FStorm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/altasoft%2FStorm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/altasoft","download_url":"https://codeload.github.com/altasoft/Storm/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/altasoft%2FStorm/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28882668,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-29T16:41:59.663Z","status":"ssl_error","status_checked_at":"2026-01-29T16:39:39.641Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":[],"created_at":"2025-10-10T14:16:57.437Z","updated_at":"2026-01-29T19:04:29.969Z","avatar_url":"https://github.com/altasoft.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# AltaSoft.Storm — Modern, High-Performance ORM for .NET\n\n[![NuGet](https://img.shields.io/nuget/v/AltaSoft.Storm.MsSql?style=for-the-badge)](https://www.nuget.org/packages/AltaSoft.Storm.MsSql)\n[![Dot NET 8+](https://img.shields.io/static/v1?label=DOTNET\u0026message=8%2B\u0026color=0c3c60\u0026style=for-the-badge)](https://dotnet.microsoft.com)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg?style=for-the-badge)](LICENSE)\n\n---\n\n## Table of Contents\n\n- [Introduction](#introduction)\n- [Philosophy \u0026 Design Goals](#philosophy--design-goals)\n- [Supported Databases](#supported-databases)\n- [Feature Overview](#feature-overview)\n- [Installation \u0026 Setup](#installation--setup)\n- [Model Definition](#model-definition)\n- [Querying \u0026 CRUD](#querying--crud)\n- [Update \u0026 Patch Examples](#update--patch-examples)\n- [Batch Operations \u0026 Bulk Insert](#batch-operations--bulk-insert)\n- [Partial Loading](#partial-loading)\n- [Unit of Work \u0026 Transactions](#unit-of-work--transactions)\n- [Stored Procedures \u0026 Scalar Functions](#stored-procedures--scalar-functions)\n- [Virtual Views \u0026 Custom SQL](#virtual-views--custom-sql)\n- [Domain Primitives](#domain-primitives)\n- [Serialization: JSON \u0026 XML](#serialization-json--xml)\n- [SQL Compression/Decompression](#sql-compressiondecompression)\n- [Change Tracking \u0026 Concurrency](#change-tracking--concurrency)\n- [Logging \u0026 Exception Handling](#logging--exception-handling)\n- [Extensibility \u0026 Advanced Configuration](#extensibility--advanced-configuration)\n- [Enum Storage: Store Enums as Strings](#enum-storage-store-enums-as-strings)\n- [Contributing](#contributing)\n- [License](#license)\n- [Contact](#contact)\n- [FAQ](#faq)\n\n---\n\n## Introduction\n\n**AltaSoft.Storm** is a lightning-fast, source-generator-powered ORM for .NET, designed to bring the best of type safety, performance, and developer ergonomics to your data layer. Storm eliminates runtime reflection, automates change tracking, and supports rich features for modern enterprise applications.\n\n---\n\n## Philosophy \u0026 Design Goals\n\n- **Performance First:** Uses C# source generators for compile-time bindings; no runtime reflection.\n- **Developer Happiness:** Clear, type-safe APIs and auto-generated helpers for all CRUD and advanced scenarios.\n- **Extensibility:** Easily supports new databases, serialization providers, and custom behaviors.\n- **Transparency:** No magic or “black box” behavior; everything is open and documented.\n\n---\n\n## Supported Databases\n\n- **MSSQL** — Fully supported, production-ready.\n- **Other DBs:** PostgreSQL, MySQL, etc., planned for future releases. Community contributions welcome!\n\n---\n\n## Feature Overview\n\n- **Source Generator Bindings** — Tables, views, stored procedures, functions, virtual views, custom SQL.\n- **Automatic Change Tracking** — Efficient IL weaving for property change detection.\n- **Batch Operations \u0026 Bulk Insert** — High-speed batch updates/inserts.\n- **Partial Loading** — Load only the fields you need, including nested/detail tables.\n- **Unit of Work \u0026 Transactions** — Robust transaction management.\n- **Stored Procedures \u0026 Scalar Functions** — Strongly-typed execution and result mapping.\n- **Virtual Views \u0026 Custom SQL** — Map models to SQL views, virtual views, or arbitrary SQL.\n- **Domain Primitives Support** — Seamless integration with [AltaSoft.DomainPrimitives](https://github.com/altasoft/DomainPrimitives).\n- **Serialization (JSON/XML)** — Save/load complex properties as JSON (preferred) or XML.\n- **SQL Compression/Decompression** — Efficiently store large strings as compressed data.\n- **Change Tracking \u0026 Concurrency** — Optimistic concurrency and dirty-checking.\n- **Logging \u0026 Error Handling** — Plug in your own logger, all errors use StormException.\n- **Table Hints, Schema Customization, Connection Management** — Advanced configuration options.\n- **Open Source, MIT Licensed, Community-Driven.**\n\n---\n\n## Installation \u0026 Setup\n\n### Prerequisites\n\n- .NET 8 or higher\n\n### NuGet Installation\n\nAdd the package to your project:\n\n```xml\n\u003cItemGroup\u003e\n  \u003cPackageReference Include=\"AltaSoft.Storm.MsSql\"/\u003e\n  \u003cPackageReference Include=\"AltaSoft.Storm.Generator.MsSql\"\u003e\n\t    \u003cPrivateAssets\u003eall\u003c/PrivateAssets\u003e\n\t    \u003cIncludeAssets\u003eruntime; build; native; contentfiles; analyzers; buildtransitive\u003c/IncludeAssets\u003e\n    \u003c/PackageReference\u003e\n\u003c/ItemGroup\u003e\n\u003cPropertyGroup\u003e\n  \u003cDefineConstants\u003e$(DefineConstants);STORM_MSSQL\u003c/DefineConstants\u003e\n\u003c/PropertyGroup\u003e\n```\n\n### Initialization\n\n```csharp\npublic sealed class  MyAppContext:StormContext;\n\nif (!StormManager.IsInitialized)\n{\n    StormManager.Initialize(new MsSqlOrmProvider(), configuration =\u003e\n    {\n        configuration.AddStormContext\u003cMyAppContext\u003e(dbConfig =\u003e\n        {\n            dbConfig.UseConnectionString(\"your-connection-string\");\n            dbConfig.UseDefaultSchema(\"dbo\");\n        });\n    });\n}\n```\n\n---\n\n## Model Definition\n\nBind C# classes to DB objects with rich attributes:\n\n```csharp\n[StormDbObject\u003cMyAppContext\u003e(SchemaName = \"dbo\", ObjectName = \"Users\", DisplayName = \"User Entity\")]\npublic sealed partial class User\n{\n    [StormColumn(ColumnType = ColumnType.PrimaryKeyAutoIncrement)]\n    public int Id { get; set; }\n\n    [StormColumn(DbType = UnifiedDbType.String, Size = 200)]\n    public string Name { get; set; }\n\n    public DateOnly BirthDate { get; set; }\n\n    [StormColumn(DbType = UnifiedDbType.Json)]\n    public List\u003cRole\u003e Roles { get; set; }\n\n    // Domain primitive support (see below)\n    public UserId UserId { get; set; }\n}\n```\n\n### Supported Attributes\n\n- **StormDbObject**: Binds to table/view/SP/function; customize schema, name, context, display name, update mode.\n- **StormColumn**: Controls DB type, size, precision, scale, name, save/load options, detail table name, concurrency, tracking, etc.\n\n---\n\n## Querying \u0026 CRUD\n\nAll CRUD and query methods are auto-generated by Storm:\n\n```csharp\nawait using var context = new MyAppContext(\"your-connection-string\");\n\n// Get by primary key\nvar user = await context.SelectFromUsersTable(1).GetAsync();\n\n// List all\nvar users = await context.SelectFromUsersTable().ListAsync();\n\n// Filtering, ordering, pagination\nvar filtered = await context.SelectFromUsersTable()\n    .Where(x =\u003e x.BirthDate \u003c new DateOnly(2010, 1, 1))\n    .OrderBy(User.OrderBy.BirthDate_Desc)\n    .Top(10)\n    .ListAsync();\n\n// Partial projection\nvar names = await context.SelectFromUsersTable().ListAsync(x =\u003e x.Name, x =\u003e x.BirthDate);\n```\n\n## Update \u0026 Delete\n\n```csharp\n// Change tracking update\nvar user = await context.SelectFromUsersTable(1).WithTracking().GetAsync();\nuser.Name = \"Updated Name\";\nawait context.UpdateUsersTable().Set(user).GoAsync();\n\n// Delete by key\nawait context.DeleteFromUsersTable(1).GoAsync();\n```\n\n---\n\n## Update \u0026 Patch Examples\n\nAltaSoft.Storm supports expressive update and patch operations. You can update specific fields directly:\n\n```csharp\n// Update a single field by key\nawait context.UpdatePersonTable(10).Set(x =\u003e x.Name, \"NewName\").GoAsync();\n\n// Update multiple fields by key\nawait context.UpdatePersonTable(10)\n    .Set(x =\u003e x.Name, \"NewName\")\n    .Set(x =\u003e x.Age, 42)\n    .GoAsync();\n\n// Patch by condition\nawait context.UpdatePersonTable()\n    .Where(x =\u003e x.Age \u003c 18)\n    .Set(x =\u003e x.IsMinor, true)\n    .GoAsync();\n\n// Set by key property\nawait context.UpdatePersonTable().Set(x =\u003e x.Id, 10).Set(x =\u003e x.Name, \"Updated\").GoAsync();\n```\n\n---\n\n## Batch Operations \u0026 Bulk Insert\n\n### Batch Update\n\n```csharp\nvar batchUsers = new[] { user1, user2, user3 };\nawait context.UpdateUsersTable().Set(batchUsers).GoAsync();\n```\n\n### Bulk Insert\n\n```csharp\nawait context.BulkInsertIntoUsersTable().Values(batchUsers).GoAsync();\n```\n\n---\n\n## Partial Loading\n\nUse partial load flags to optimize queries:\n\n```csharp\nvar userList = await context.SelectFromUsersTable()\n    .Partially(User.PartialLoadFlags.FullName)\n    .OrderBy(User.OrderByKey)\n    .ListAsync();\n```\n\nLoad detail tables or nested objects as needed.\n\n---\n\n## Unit of Work \u0026 Transactions\n\nManage complex operations atomically:\n\n```csharp\nusing var uow = UnitOfWork.Create();\nawait using var tx = await uow.BeginAsync(\"your-connection-string\", CancellationToken.None);\n\nvar context = new MyAppContext(\"your-connection-string\");\n\n// Batch update\nawait context.UpdateUsersTable().Set(usersToUpdate).GoAsync();\n\nawait tx.CompleteAsync(CancellationToken.None);\n```\n\n---\n\n## Stored Procedures \u0026 Scalar Functions\n\nCall stored procedures and functions with type safety:\n\n```csharp\n// Scalar function\nvar result = await context.ExecuteScalarFunc(userId, branchId).GetAsync();\n\n// Stored procedure\nvar procResult = await context.ExecuteInputOutputProc(userId, ioValue).GoAsync();\n// procResult contains output parameters, rows affected, etc.\n```\n\nParameters and results are mapped automatically.\n\n---\n\n## Virtual Views \u0026 Custom SQL\n\nMap models to SQL views, virtual views, or custom SQL statements:\n\n```csharp\n// Virtual view\nvar specialUsers = await context.SelectFromUsersVirtualView().ListAsync();\n\n// Custom SQL\nvar customSql = \"SELECT * FROM dbo.Users WHERE IsActive = 1\";\nvar activeUsers = await context.SelectFromUsersCustomSql(customSql).ListAsync();\n```\n\n---\n\n## Domain Primitives\n\nStorm seamlessly supports [AltaSoft.DomainPrimitives](https://github.com/altasoft/DomainPrimitives):\n\n```csharp\npublic class User\n{\n    public UserId Id { get; set; } // auto-mapped to underlying type\n}\n```\nNo extra configuration needed.\n\n---\n\n## Serialization: JSON \u0026 XML\n\n**JSON is preferred** for complex object storage:\n\n```csharp\n[StormColumn(DbType = UnifiedDbType.Json)]\npublic List\u003cRole\u003e Roles { get; set; }\n```\n\n**XML** is also supported:\n\n```csharp\n[StormColumn(DbType = UnifiedDbType.Xml)]\npublic Profile ProfileXml { get; set; }\n```\n\nPlug in custom serialization providers if needed:\n\n```csharp\nStormManager.Initialize(\n    new MsSqlOrmProvider(), \n    configuration =\u003e { /* ... */ },\n    jsonSerializationProvider: new MyJsonProvider(), \n    xmlSerializationProvider: new MyXmlProvider()\n);\n```\n\n---\n\n## SQL Compression/Decompression\n\nEfficiently store large strings as compressed binary:\n\n```csharp\n[StormColumn(DbType = UnifiedDbType.VarBinary, SaveAs = SaveAs.CompressedString)]\npublic string BigString { get; set; }\n```\n\nStorm will compress on save and decompress on retrieval automatically.\n\n---\n\n## Change Tracking \u0026 Concurrency\n\nChange tracking is automatic (IL weave); use it for dirty-checking and efficient updates.\n\n```csharp\nvar user = await context.SelectFromUsersTable(1).WithTracking().GetAsync();\nuser.Name = \"New Name\";\nif (user.IsDirty())\n    await context.UpdateUsersTable().Set(user).GoAsync();\n```\n\nSupport for concurrency check and optimistic locking:\n\n```csharp\n[StormColumn(ColumnType = ColumnType.ConcurrencyCheck | ColumnType.RowVersion)]\npublic byte[] RowVersion { get; set; }\n```\n\n---\n\n## Logging \u0026 Exception Handling\n\nPlug in any `ILogger` implementation for full logging. All ORM errors use `StormException` for clear diagnostics.\n\n```csharp\nStormManager.SetLogger(myLogger);\n```\n\n---\n\n## Extensibility \u0026 Advanced Configuration\n\n- **Custom Table/View Names:** Use `SchemaName`, `ObjectName`, and `DisplayName` in `[StormDbObject]`.\n- **Detail Table Mapping:** Use `DetailTableName` in `[StormColumn]` for one-to-many relationships.\n- **Concurrency \u0026 Tracking:** Use appropriate column types.\n- **Custom Exception Handling:** All ORM errors throw `StormException`.\n- **Custom Serialization Providers:** Plug in your own.\n- **Source Generators:** Easily extend for new DBs and behaviors.\n\n---\n\n## Enum Storage: Store Enums as Strings\n\nStorm supports storing enums as strings in the database for better readability and schema evolution. To enable this, use the `[StormStringEnum\u003cEnumType, ConverterType\u003e(maxLength)]` attribute on your enum definition, and annotate your model property with `[StormColumn(SaveAs = SaveAs.String)]`:\n\n```csharp\n[StormStringEnum\u003cRgbColor, RgbColorExt\u003e(16)]\npublic enum RgbColor : sbyte {\n    Red,\n    Green,\n    Blue,\n    White,\n    Black\n}\n\npublic sealed class RgbColorExt : IStormStringToEnumConverter\u003cRgbColor\u003e\n{\n    public static string ToDbString(RgbColor value)\n    {\n        return value switch\n        {\n            RgbColor.Red =\u003e \"#FF0000\",\n            RgbColor.Green =\u003e \"#00FF00\",\n            RgbColor.Blue =\u003e \"#0000FF\",\n            RgbColor.White =\u003e \"#FFFFFF\",\n            RgbColor.Black =\u003e \"#000000\",\n            _ =\u003e throw new ArgumentOutOfRangeException(nameof(value), value, null)\n        };\n    }\n\n    public static RgbColor FromDbString(string value)\n    {\n        return value.ToUpper() switch\n        {\n            \"#FF0000\" =\u003e RgbColor.Red,\n            \"#00FF00\" =\u003e RgbColor.Green,\n            \"#0000FF\" =\u003e RgbColor.Blue,\n            \"#FFFFFF\" =\u003e RgbColor.White,\n            \"#000000\" =\u003e RgbColor.Black,\n            _ =\u003e throw new ArgumentOutOfRangeException(nameof(value), value, null)\n        };\n    }\n}\n\npublic class Car {\n    [StormColumn(SaveAs = SaveAs.String)]\n    public RgbColor Color { get; set; } = RgbColor.Blue;\n}\n```\n\nThis configuration ensures that the enum values are stored as strings in the database, rather than their underlying integer values. This approach improves schema clarity and makes future changes to enum values safer.\n\n---\n\n## Contributing\n\nAltaSoft.Storm is MIT licensed and welcomes all contributions! Open issues, submit PRs, and help us build the future of .NET ORM.\n\n---\n\n## License\n\nMIT\n\n---\n\n## Contact\n\nFor support, questions, or additional info:\n- [GitHub Issues](https://github.com/altasoft/Storm/issues)\n- Discussions tab on GitHub\n\n---\n\n## FAQ\n\n### Can I use Storm with databases other than MSSQL?\nCurrently, only MSSQL is fully supported. Other databases are planned for future releases. Contributions are welcome!\n\n### How do I add a new model or context?\nJust use `[StormDbObject\u003cMyContext\u003e]` and Storm will generate all extension methods and helpers automatically.\n\n### How are domain primitives handled?\nAny type implementing the domain primitive pattern is auto-mapped to its underlying DB type.\n\n### How do I bulk insert or batch update?\nUse the generated `BulkInsertInto...` or batch update methods—see code samples above.\n\n### How do I handle transactions?\nUse `UnitOfWork.Create()` and transaction helpers.\n\n### How do I report bugs or request features?\nOpen an issue or discussion on GitHub!\n\n---\n\n## Related Projects\n\n- [AltaSoft.DomainPrimitives](https://github.com/altasoft/DomainPrimitives)\n\n---\n\n_AltaSoft.Storm — Fast, Modern, and Open Source ORM for .NET_\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faltasoft%2Fstorm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faltasoft%2Fstorm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faltasoft%2Fstorm/lists"}