You're Invited:Meet the Socket Team at BlackHat and DEF CON in Las Vegas, Aug 4-6.RSVP
Socket
Book a DemoInstallSign in
Socket

Vitorm

Package Overview
Dependencies
Maintainers
3
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

Vitorm

Vitorm : simple orm

2.5.0
Source
nugetNuGet
Version published
Maintainers
3
Created
Source

Vitorm

Vitorm is a lightweight yet comprehensive ORM that strikes the perfect balance between simplicity and functionality.
Similar to Dapper in its lightweight design, Vitorm offers an easy-to-use, efficient interface for data access.
However, it doesn't stop there; Vitorm goes beyond basic ORM capabilities to provide a rich feature set akin to Entity Framework.
This means you get the best of both worlds: the performance and simplicity of Dapper with the robust features and flexibility of Entity Framework, making Vitorm an ideal choice for developers seeking a powerful yet streamlined ORM solution.

source address: https://github.com/Vit-Orm/Vitorm


BuildNuGet

Vitorm Documentation

This guide will walk you through the steps to set up and use Vitorm with SQLite.

supported features:

featuremethodremarks
create tableTryCreateTable
drop tableTryDropTable
truncate tableTruncate
------------
create recordsAdd AddRange
retrieve recordsQuery Get
update recordsUpdate UpdateRange ExecuteUpdate
delete recordsDelete DeleteRange DeleteByKey DeleteByKeys ExecuteDelete
------------
change tableChangeTablechange mapping table from database
change databaseChangeDatabasechange database to be connected
------------
collection total countTotalCountCollection Total Count without Take and Skip
collection total count and listToListAndTotalCountquery List and TotalCount in one request

Installation

Before using Vitorm, install the necessary package:

dotnet add package Vitorm.Sqlite

Minimum viable demo

code address: Program_Min.cs

using Vitorm;
namespace App
{
    public class Program_Min
    {
        static void Main2(string[] args)
        {
            // #1 Init
            using var dbContext = new Vitorm.Sql.SqlDbContext();
            dbContext.UseSqlite("data source=sqlite.db");

            // #2 Query
            var user = dbContext.Get<User>(1);
            var users = dbContext.Query<User>().Where(u => u.name.Contains("li")).ToList();
        }

        // Entity Definition
        [System.ComponentModel.DataAnnotations.Schema.Table("User")]
        public class User
        {
            [System.ComponentModel.DataAnnotations.Key]
            public int id { get; set; }
            public string name { get; set; }
            public DateTime? birth { get; set; }
            public int? fatherId { get; set; }
        }
    }
}

Full Example

This example provides a comprehensive guide to utilizing Vitorm for basic and advanced database operations while maintaining lightweight performance.
code address: Program.cs

using Vitorm;

namespace App
{
    public class Program
    {
        static void Main(string[] args)
        {
            // #1 Configures Vitorm
            using var dbContext = new Vitorm.Sql.SqlDbContext();
            dbContext.UseSqlite("data source=sqlite.db");

            // #2 Create Table
            dbContext.TryDropTable<User>();
            dbContext.TryCreateTable<User>();

            // #3 Insert Records
            dbContext.Add(new User { id = 1, name = "lith" });
            dbContext.AddRange(new[] {
                new User { id = 2, name = "lith", fatherId = 1 },
                new User { id = 3, name = "lith", fatherId = 1 }
            });

            // #4 Query Records
            {
                var user = dbContext.Get<User>(1);
                var users = dbContext.Query<User>().Where(u => u.name.Contains("li")).ToList();
                var sql = dbContext.Query<User>().Where(u => u.name.Contains("li")).ToExecuteString();
            }

            // #5 Update Records
            dbContext.Update(new User { id = 1, name = "lith1" });
            dbContext.UpdateRange(new[] {
                new User { id = 2, name = "lith2", fatherId = 1 },
                new User { id = 3, name = "lith3", fatherId = 2 }
            });
            dbContext.Query<User>().Where(u => u.name.Contains("li"))
                .ExecuteUpdate(u => new User { name = "Lith" + u.id });

            // #6 Delete Records
            dbContext.Delete<User>(new User { id = 1, name = "lith1" });
            dbContext.DeleteRange(new[] {
                new User { id = 2, name = "lith2", fatherId = 1 },
                new User { id = 3, name = "lith3", fatherId = 2 }
            });
            dbContext.DeleteByKey<User>(1);
            dbContext.DeleteByKeys<User, int>(new[] { 1, 2 });
            dbContext.Query<User>().Where(u => u.name.Contains("li"))
                .ExecuteDelete();
            dbContext.Truncate<User>();

            // #7 Join Queries
            {
                var query =
                        from user in dbContext.Query<User>()
                        from father in dbContext.Query<User>().Where(father => user.fatherId == father.id).DefaultIfEmpty()
                        where father != null
                        orderby user.id
                        select new { user, father };

                var sql = query.ToExecuteString();
                var users = query.ToList();
            }

            // #8 Transactions
            {
                using var tran1 = dbContext.BeginTransaction();
                dbContext.Update(new User { id = 4, name = "u4001" });

                using (var tran2 = dbContext.BeginTransaction())
                {
                    dbContext.Update(new User { id = 4, name = "u4002" });
                    // will rollback
                }

                using (var tran2 = dbContext.BeginTransaction())
                {
                    dbContext.Update(new User { id = 4, name = "u4002" });
                    tran2.Rollback();
                }

                using (var tran2 = dbContext.BeginTransaction())
                {
                    dbContext.Update(new User { id = 4, name = "u4003" });
                    tran2.Commit();
                }

                tran1.Commit();
            }

            // #9 Database Functions
            {
                // select * from User where IIF(t0.fatherId is not null, true, false);
                var query = dbContext.Query<User>().Where(u => DbFunction.Call<bool>("IIF", u.fatherId != null, true, false));
                var sql = query.ToExecuteString();
                var userList = query.ToList();
            }
        }

        // Entity Definition
        [System.ComponentModel.DataAnnotations.Schema.Table("User")]
        public class User
        {
            [System.ComponentModel.DataAnnotations.Key]
            public int id { get; set; }
            public string name { get; set; }
            public DateTime? birth { get; set; }
            public int? fatherId { get; set; }
        }
    }
}

Explanation

  • Setup: Initializes the database and configures Vitorm.
  • Create Table: Drops and recreates the User table.
  • Insert Records: Adds single and multiple user records.
  • Query Records: Retrieves user records using various querying methods.
  • Update Records: Updates single and multiple user records.
  • Delete Records: Deletes single and multiple user records.
  • Join Queries: Performs a join operation between user and father records.
  • Transactions: Demonstrates nested transactions and rollback/commit operations.
  • Database Functions: Uses custom database functions in queries.

Vitorm.Data Documentation

Vitorm.Data is a static class that allows you to use Vitorm without explicitly creating or disposing of a DbContext.

Installation

Before using Vitorm.Data, install the necessary package:

dotnet add package Vitorm.Data
dotnet add package Vitorm.Sqlite

Config settings

// appsettings.json
{
  "Vitorm": {
    "Data": [
      {
        "provider": "Sqlite",
        "namespace": "App",
        "connectionString": "data source=sqlite.db;"
      }
    ]
  }
}

Minimum viable demo

After configuring the appsettings.json file, you can directly perform queries without any additional configuration or initialization, Vitorm.Data is that easy to use.
code address: Program_Min.cs

using Vitorm;
namespace App
{
    public class Program_Min
    {
        static void Main2(string[] args)
        {
            //  Query Records
            var user = Data.Get<User>(1);
            var users = Data.Query<User>().Where(u => u.name.Contains("li")).ToList();
        }

        // Entity Definition
        [System.ComponentModel.DataAnnotations.Schema.Table("User")]
        public class User
        {
            [System.ComponentModel.DataAnnotations.Key]
            public int id { get; set; }
            public string name { get; set; }
            public DateTime? birth { get; set; }
            public int? fatherId { get; set; }
        }
    }
}

Full Example

code address: Program.cs

using Vitorm;

namespace App
{
    public class Program
    {
        static void Main(string[] args)
        {
            // #1 No need to init Vitorm.Data

            // #2 Create Table
            Data.TryDropTable<User>();
            Data.TryCreateTable<User>();

            // #3 Insert Records
            Data.Add(new User { id = 1, name = "lith" });
            Data.AddRange(new[] {
                new User { id = 2, name = "lith", fatherId = 1 },
                new User { id = 3, name = "lith", fatherId = 1 }
            });

            // #4 Query Records
            {
                var user = Data.Get<User>(1);
                var users = Data.Query<User>().Where(u => u.name.Contains("li")).ToList();
                var sql = Data.Query<User>().Where(u => u.name.Contains("li")).ToExecuteString();
            }

            // #5 Update Records
            Data.Update(new User { id = 1, name = "lith1" });
            Data.UpdateRange(new[] {
                new User { id = 2, name = "lith2", fatherId = 1 },
                new User { id = 3, name = "lith3", fatherId = 2 }
            });
            Data.Query<User>().Where(u => u.name.Contains("li"))
                .ExecuteUpdate(u => new User { name = "Lith" + u.id });

            // #6 Delete Records
            Data.Delete<User>(new User { id = 1, name = "lith1" });
            Data.DeleteRange(new[] {
                new User { id = 2, name = "lith2", fatherId = 1 },
                new User { id = 3, name = "lith3", fatherId = 2 }
            });
            Data.DeleteByKey<User>(1);
            Data.DeleteByKeys<User, int>(new[] { 1, 2 });
            Data.Query<User>().Where(u => u.name.Contains("li"))
                .ExecuteDelete();
            Data.Truncate<User>();

            // #7 Join Queries
            {
                var query =
                        from user in Data.Query<User>()
                        from father in Data.Query<User>().Where(father => user.fatherId == father.id).DefaultIfEmpty()
                        where father != null
                        orderby user.id
                        select new { user, father };

                var sql = query.ToExecuteString();
                var users = query.ToList();
            }

            // #8 Transactions
            {
                using var dbContext = Data.DataProvider<User>().CreateSqlDbContext();
                using var tran1 = dbContext.BeginTransaction();

                dbContext.Update(new User { id = 4, name = "u4001" });

                using (var tran2 = dbContext.BeginTransaction())
                {
                    dbContext.Update(new User { id = 4, name = "u4002" });
                    // will rollback
                }

                using (var tran2 = dbContext.BeginTransaction())
                {
                    dbContext.Update(new User { id = 4, name = "u4002" });
                    tran2.Rollback();
                }

                using (var tran2 = dbContext.BeginTransaction())
                {
                    dbContext.Update(new User { id = 4, name = "u4003" });
                    tran2.Commit();
                }

                tran1.Commit();
            }

            // #9 Database Functions
            {
                // select * from User where IIF(t0.fatherId is not null, true, false);
                var query = Data.Query<User>().Where(u => DbFunction.Call<bool>("IIF", u.fatherId != null, true, false));
                var sql = query.ToExecuteString();
                var userList = query.ToList();
            }
        }

        // Entity Definition
        [System.ComponentModel.DataAnnotations.Schema.Table("User")]
        public class User
        {
            [System.ComponentModel.DataAnnotations.Key]
            public int id { get; set; }
            public string name { get; set; }
            public DateTime? birth { get; set; }
            public int? fatherId { get; set; }
        }
    }
}

Comparison of performance with other ORMs

Through benchmarks, there may be slight variations depending on the database source, for reference only. code address: Vitorm.Data.Benchmark

SqlServer

MethodqueryJointakerunnerMeanErrorStdDev
RunFalse1Runner_EntityFramework5.380 ms0.0449 ms0.0398 ms
RunFalse1Runner_SqlSuger4.929 ms0.0588 ms0.0550 ms
RunFalse1Runner_Vitorm4.925 ms0.0506 ms0.0474 ms
RunFalse1000Runner_EntityFramework6.009 ms0.0963 ms0.0853 ms
RunFalse1000Runner_SqlSuger5.616 ms0.1114 ms0.1488 ms
RunFalse1000Runner_Vitorm5.539 ms0.1060 ms0.1262 ms
RunTrue1Runner_EntityFramework5.453 ms0.0571 ms0.0534 ms
RunTrue1Runner_SqlSuger5.601 ms0.0477 ms0.0423 ms
RunTrue1Runner_Vitorm5.337 ms0.0596 ms0.0528 ms
RunTrue1000Runner_EntityFramework1,706.222 ms4.4435 ms3.9391 ms
RunTrue1000Runner_SqlSuger125.150 ms2.3678 ms2.3255 ms
RunTrue1000Runner_Vitorm21.027 ms0.3564 ms0.3334 ms

MySql

MethodqueryJointakerunnerMeanErrorStdDev
RunFalse1Runner_EntityFramework1,231.1 μs47.43 μs139.84 μs
RunFalse1Runner_SqlSuger873.7 μs22.33 μs65.49 μs
RunFalse1Runner_Vitorm636.7 μs21.15 μs62.37 μs
RunFalse1000Runner_EntityFramework4,764.8 μs56.52 μs52.87 μs
RunFalse1000Runner_SqlSuger1,906.4 μs33.21 μs42.00 μs
RunFalse1000Runner_Vitorm2,159.5 μs43.16 μs56.12 μs
RunTrue1Runner_EntityFramework1,775.0 μs35.01 μs80.45 μs
RunTrue1Runner_SqlSuger1,747.5 μs34.05 μs44.27 μs
RunTrue1Runner_Vitorm1,292.5 μs25.72 μs41.54 μs
RunTrue1000Runner_EntityFramework6,784.4 μs102.05 μs95.45 μs
RunTrue1000Runner_SqlSuger113,634.4 μs1,128.58 μs1,055.67 μs
RunTrue1000Runner_Vitorm3,175.2 μs62.02 μs88.95 μs

Sqlite

MethodqueryJointakerunnerMeanErrorStdDev
RunFalse1Runner_EntityFramework115.32 μs0.831 μs0.778 μs
RunFalse1Runner_SqlSuger81.66 μs0.747 μs0.699 μs
RunFalse1Runner_Vitorm45.64 μs0.350 μs0.328 μs
RunFalse1000Runner_EntityFramework1,386.81 μs13.684 μs12.800 μs
RunFalse1000Runner_SqlSuger674.82 μs4.938 μs4.619 μs
RunFalse1000Runner_Vitorm769.88 μs6.020 μs5.631 μs
RunTrue1Runner_EntityFramework220.27 μs1.916 μs1.793 μs
RunTrue1Runner_SqlSuger484.52 μs6.746 μs5.980 μs
RunTrue1Runner_Vitorm167.89 μs1.352 μs1.264 μs
RunTrue1000Runner_EntityFramework1,962.25 μs10.031 μs8.377 μs
RunTrue1000Runner_SqlSuger103,179.50 μs534.265 μs446.135 μs
RunTrue1000Runner_Vitorm1,684.39 μs21.895 μs18.283 μs

Examples

Keywords

orm

FAQs

Package last updated on 12 Jan 2025

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts