Wissance.nOrm 3.0.0

dotnet add package Wissance.nOrm --version 3.0.0
                    
NuGet\Install-Package Wissance.nOrm -Version 3.0.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Wissance.nOrm" Version="3.0.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Wissance.nOrm" Version="3.0.0" />
                    
Directory.Packages.props
<PackageReference Include="Wissance.nOrm" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Wissance.nOrm --version 3.0.0
                    
#r "nuget: Wissance.nOrm, 3.0.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Wissance.nOrm@3.0.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Wissance.nOrm&version=3.0.0
                    
Install as a Cake Addin
#tool nuget:?package=Wissance.nOrm&version=3.0.0
                    
Install as a Cake Tool

Norm

Ultra fast multi threads/tasks .Net Database framework.

Norm logo

Features

Norm is stands for Not an ORM is a C# lib for very HIGH Speed DB data processing in async way with immediately operations and at background with Processing data with Batches. It at least 10 times faster then EF/EF.Core. In Comparison to ORMs Norm has following disadvantages:

  1. No object tracking
  2. No Lazy loading properties

But it gives us the following:

  1. Read spead is fast (10000 rows select from 100000 rows Mysql database ~100-200 ms)
Table size (rows) Rows to select Time, ms
100k 10k 154
100k 10k in a middle 190
100k 100k 1114
1M 100k 1135
1M 500k 5624
  1. Insert speed is fast (10000 rows ~ 600 ms, 100000 rows ~ 3000-5000 ms on i5 CPU for MySql 8.0.23 with default settings)
Rows to insert Time, ms
100 13
1000 62
10000 549
100000 5111
  1. Can work with DB in multiple threads unlike do all ORMs
  2. Support BULK operations
  3. Can synchronize data in background (for quite big operations, truly async behavior)
  4. Can be used in CQRS approach because works in own thread and uses multiple tasks.
  5. All modification operations (Create, Update and Delete) are using DB Transactions.

How to use

Norm works with persistant entities (table mapping or aggregate to multiple tables) via Repository interface IDbRepository<T> (T is a generic type of persistant object, i.e. User). Norm has following implementation of IDbRepository<T> interface:

  1. MySqlBufferedRepository<T> for MySql DB server, it implements BufferedDbRepository<T>
  2. SqlServerBufferedRepository<T> for SqlServer DB server, it implements BufferedDbRepository<T>
  3. PostgresBufferedRepository<T> for Postgres DB server, it implements BufferedDbRepository<T>
  4. SqLiteBufferedRepository<T> for SqLite DB server, it implements BufferedDbRepository<T>

Consider how to use it on MySql Db:

  1. Add the appropriate package; see the section below
  2. Create a IDbRepository<T> instance as follows:
    DbRepositorySettings dbRepositorySettings = new DbRepositorySettings()
    {
        BufferThreshold = 100,
        CommandTimeout = 120,
        BufferSynchronizationDelayTimeout = 100,
        ForceSynchronizationBufferDelay = 500
    };
    IDbRepository<PhysicalValueEntity> repo = new MySqlBufferedRepository<PhysicalValueEntity>(ConnectionString, dbRepositorySettings,
                                                                                               new PhysicalValueQueryBuilder(),
                                                                                               PhysicalValueFactory.Create, new NullLoggerFactory());

Contructor expect following params:

  • DB connection string
  • Repository settings:
    • BufferThreshold size of buffer (creainge or updainge entities) to sync
    • Timeout of executing command in seconds
    • BufferSynchronizationDelayTimeout time in ms between background synchronization iterations attempts
    • ForceSynchronizationBufferDelay timeout for sync if amount of items to create/update < BufferThreshold
  • query builder that implements interface IDbEntityQueryBuilder<TE> (see example in tests)
  • factory that builds Entity from array of column values (see also tests)
  • logger factory
  1. Read Entities 3.1 Without filtering
   IList<PhysicalValueEntity> items = await repo.GetManyAsync(page, size, new List<WhereParameter>(), null);
3.2 With filtering
  IList<PhysicalValueEntity> items = await repo.GetManyAsync(page, size, new List<WhereParameter>()
  {
      new WhereParameter("id", null, false, WhereComparison.Greater, new List<object>(){lowerIdValue}, false),
      new WhereParameter("id", WhereJoinCondition.And, false, WhereComparison.Less, new List<object>(){upperIdValue}, false)
  }, null);
  1. Create Entity 4.1 Single
    PhysicalValueEntity entity = new PhysicalValueEntity()
    {
        Id = id,
        Name = "new phys value",
        Description = "new phys value",
        Designation = "NPV"
     };
     bool result = await repo.InsertAsync(entity, true);

The last insert method param is responsible for inserting into the Repository task in the background if false or immediately if true 4.2 Bulk

    IList<PhysicalValueEntity> newPhysValues = new List<PhysicalValueEntity>()
    {
        new PhysicalValueEntity()
        {
            Id = 30,
            Name = "new phys value",
            Description = "new phys value",
            Designation = "NPV"
         },
         new PhysicalValueEntity()
         {
             Id = 31,
             Name = "new phys value2",
             Description = "new phys value2",
             Designation = "NPV2"
          },
          new PhysicalValueEntity()
          {
              Id = 32,
              Name = "new phys value3",
              Description = "new phys value3",
              Designation = "NPV3"
          }
     };
     int result = await repo.BulkInsertAsync(newPhysValues, true);
  1. Update and bulk update are analogous to create methods:
  2. Delete is quite a simple:
    bool result = await repo.DeleteAsync(new List<WhereParameter>()
    {
        new WhereParameter("id", null, false, WhereComparison.Equal, new List<object>(){newPhysValue.Id})
    });

Nuget

  1. Interface
  2. Mysql
  3. Postgres
  4. SqlServer
  5. SqLite
Product Compatible and additional computed target framework versions.
.NET net6.0 is compatible.  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 is compatible.  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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
3.0.0 106 3/24/2026
2.0.0 224 5/11/2025

All operations are working via DbCommand and DbParameter for preventing SQL Injection