当前位置: 首页 > news >正文

.NET常用的ORM框架及性能优劣分析总结

市面上有很多流行的 ORM(对象关系映射)框架可以用于 .NET 开发。本文主要针对以下几种常见的 ORM 框架,对其优劣进行分析及总结,希望能够帮助大家进行ORM框架的使用有所帮助。

1. Entity Framework (EF)


特点
•    官方支持:由 Microsoft 开发和维护,是 .NET 生态系统中最受欢迎的 ORM 框架。
•    丰富的特性:
•    支持 Code First、Database First 和 Model First 等多种开发模式。
•    提供强大的 LINQ 查询支持。
•    内置迁移工具,方便数据库版本控制。
•    支持多种数据库,如 SQL Server、MySQL、PostgreSQL、SQLite 等。
•    性能优化:
•    提供了缓存机制、异步操作等性能优化选项。
•    社区活跃:
•    拥有庞大的开发者社区和丰富的文档资源。
示例代码

using Microsoft.EntityFrameworkCore;public class BloggingContext : DbContext
{public DbSet<Blog> Blogs { get; set; }public DbSet<Post> Posts { get; set; }protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){optionsBuilder.UseSqlServer("YourConnectionStringHere");}
}

2. Dapper


特点
•    轻量级:Dapper 是一个微 ORM,专注于简单的查询和映射,性能极高。
•    简洁易用:
•    使用简单,学习曲线低。
•    直接执行 SQL 查询并返回强类型结果。
•    灵活性:
•    允许编写原生 SQL 查询,适合需要高度控制查询语句的场景。
•    性能优异:
•    性能非常接近直接使用 ADO.NET,适合高并发场景。
示例代码

using Dapper;
using System.Data.SqlClient;public class Product
{public int Id { get; set; }public string Name { get; set; }public decimal Price { get; set; }
}public List<Product> GetProducts()
{using (var connection = new SqlConnection("YourConnectionStringHere")){return connection.Query<Product>("SELECT * FROM Products").ToList();}
}

3. NHibernate


特点
•    历史悠久:基于 Java 的 Hibernate 框架移植而来,功能强大且成熟。
•    丰富的特性:
•    支持复杂的映射配置,包括继承、多对多关系等。
•    提供缓存、事务管理等功能。
•    支持多种数据库,如 SQL Server、MySQL、PostgreSQL 等。
•    灵活性:
•    配置灵活,支持 XML 和 Fluent API 两种方式。
•    学习曲线较陡:
•    功能丰富但也相对复杂,初学者可能需要更多时间来掌握。
示例代码

using NHibernate;
using NHibernate.Cfg;public class Product
{public virtual int Id { get; set; }public virtual string Name { get; set; }public virtual decimal Price { get; set; }
}public class ProductMap : ClassMapping<Product>
{public ProductMap(){Table("Products");Id(x => x.Id, m => m.Generator(Generators.Identity));Property(x => x.Name);Property(x => x.Price);}
}public class Program
{private static ISessionFactory sessionFactory;public static void Main(string[] args){var configuration = new Configuration();configuration.Configure();configuration.AddMapping(new ProductMap());sessionFactory = configuration.BuildSessionFactory();using (var session = sessionFactory.OpenSession()){using (var transaction = session.BeginTransaction()){var product = session.Get<Product>(1);Console.WriteLine(product.Name);transaction.Commit();}}}
}

4. LLBLGen Pro


特点
•    商业产品:提供专业版和社区版,功能全面且性能优越。
•    丰富的特性:
•    支持多种数据库,如 SQL Server、MySQL、PostgreSQL、Oracle 等。
•    提供强大的代码生成工具,自动生成实体类和数据访问层代码。
•    支持 LINQ 查询、事务管理等功能。
•    灵活性:
•    可以选择不同的设计模式,如 Active Record、Repository 等。
•    性能优化:
•    提供了多种性能优化选项,如批量操作、缓存机制等。
示例代码

using SD.LLBLGen.Pro.ORMSupportClasses;
using SD.LLBLGen.Pro.Examples.EntityClasses;public class ProductService
{private readonly IPersistenceCore _persistenceCore;public ProductService(IPersistenceCore persistenceCore){_persistenceCore = persistenceCore;}public List<ProductEntity> GetProducts(){using (var adapter = new DataAccessAdapter()){var products = new List<ProductEntity>();adapter.FetchEntityCollection(products, null);return products;}}
}

5. NPoco


特点
•    轻量级:类似于 Dapper,但提供了更多的功能。
•    简洁易用:
•    使用简单,学习曲线低。
•    支持 LINQ 查询和 POCO 映射。
•    灵活性:
•    允许编写原生 SQL 查询,适合需要高度控制查询语句的场景。
•    性能优异:
•    性能接近 Dapper,适合高并发场景。
示例代码

using NPoco;
using System.Data.SqlClient;public class Product
{public int Id { get; set; }public string Name { get; set; }public decimal Price { get; set; }
}public class Database : Database
{public Database() : base("YourConnectionStringHere", DatabaseType.SqlServer2012) { }
}public List<Product> GetProducts()
{using (var db = new Database()){return db.Fetch<Product>("SELECT * FROM Products");}
}

6. RepoDb


特点
•    轻量级:专注于高性能的数据访问操作。
•    简洁易用:
•    使用简单,学习曲线低。
•    支持 LINQ 查询和 POCO 映射。
•    灵活性:
•    允许编写原生 SQL 查询,适合需要高度控制查询语句的场景。
•    性能优异:
•    性能非常接近直接使用 ADO.NET,适合高并发场景。
示例代码

using RepoDb;
using System.Data.SqlClient;public class Product
{public int Id { get; set; }public string Name { get; set; }public decimal Price { get; set; }
}public class Program
{public static void Main(string[] args){using (var connection = new SqlConnection("YourConnectionStringHere")){var products = connection.QueryAll<Product>();foreach (var product in products){Console.WriteLine($"{product.Name} - {product.Price}");}}}
}

7.SqlSugar


优点
1.    易用性:
•    SqlSugar 的 API 设计非常简洁,易于上手,适合快速开发。
2.    多数据库支持:
•    支持多种主流数据库,包括 MySQL、SQL Server、PostgreSQL、Oracle、SQLite、ClickHouse 等。
3.    丰富的特性:
•    提供了诸如分页、事务管理、批量操作、动态表名等功能,并且支持复杂的查询构建。
4.    良好的文档和支持:
•    官方文档详尽,提供了大量的示例代码和教程,便于学习和使用。
5.    扩展性强:
•    可以通过插件或扩展包(如 SqlSugar.ClickHouseCore)轻松扩展功能。
6.    性能优化:
•    提供了一些性能优化选项,如缓存机制和异步操作。
缺点
1.    某些高级功能不够完善:
•    虽然 SqlSugar 功能丰富,但在某些高级功能上可能不如 FreeSQL 强大。
2.    社区活跃度稍低:
•    相比 FreeSQL,SqlSugar 的社区活跃度略低,但仍然有较好的支持。

using SqlSugar;
using Microsoft.Extensions.Configuration;
using System;
using System.IO;
using System.Linq;namespace SqlSugarClickHouseExample
{[SugarTable("orders")]public class Order{[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]public int Id { get; set; }public DateTime OrderDate { get; set; }public int CustomerId { get; set; }public int ProductId { get; set; }public int Quantity { get; set; }public decimal Price { get; set; }}class Program{static void Main(string[] args){// 读取配置文件var configuration = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json", optional: false, reloadOnChange: true).Build();// 获取连接字符串var connectionString = configuration.GetConnectionString("Default");// 创建 SqlSugarClient 实例var db = new SqlSugarClient(new ConnectionConfig(){ConnectionString = connectionString,DbType = DbType.ClickHouse,IsAutoCloseConnection = true});// 插入数据var order = new Order{OrderDate = DateTime.Now,CustomerId = 1,ProductId = 101,Quantity = 2,Price = 19.99m};db.Insertable(order).ExecuteCommand();// 查询数据var orders = db.Queryable<Order>().Where(o => o.OrderDate >= new DateTime(2023, 1, 1)).OrderByDescending(o => o.OrderDate).ToList();foreach (var item in orders){Console.WriteLine($"Order ID: {item.Id}, Order Date: {item.OrderDate}, Customer ID: {item.CustomerId}, Product ID: {item.ProductId}, Quantity: {item.Quantity}, Price: {item.Price}");}// 更新数据order.Quantity = 3;db.Updateable(order).ExecuteCommand();// 删除数据db.Deleteable<Order>().InSingle(order.Id).ExecuteCommand();}}
}

8.FreeSQL


优点
1.    高性能:
•    FreeSQL 在查询生成和执行方面进行了大量优化,提供了高效的数据库操作。
2.    多数据库支持:
•    支持多种主流数据库,如 MySQL、SQL Server、PostgreSQL、SQLite 等。
3.    丰富的特性:
•    提供了诸如分页、事务管理、批量操作等常用功能,并且支持复杂的查询构建。
4.    活跃的社区:
•    拥有一个活跃的开发者社区,能够及时获得支持和更新。
5.    代码生成器:
•    内置了强大的代码生成工具,可以自动生成实体类和 CRUD 操作代码。
缺点
1.    学习曲线:
•    对于初学者来说,可能需要一些时间来熟悉其 API 和配置。
2.    文档相对较少:
•    相比 SqlSugar,FreeSQL 的官方文档和示例代码相对较少。

示例代码:

using FreeSql;
using Microsoft.Extensions.Configuration;
using System;
using System.IO;
using System.Linq;namespace FreeSqlClickHouseExample
{[Table(Name = "orders")]public class Order{[Column(IsPrimary = true, IsIdentity = true)]public int Id { get; set; }public DateTime OrderDate { get; set; }public int CustomerId { get; set; }public int ProductId { get; set; }public int Quantity { get; set; }public decimal Price { get; set; }}class Program{static void Main(string[] args){// 读取配置文件var configuration = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json", optional: false, reloadOnChange: true).Build();// 获取连接字符串var connectionString = configuration.GetConnectionString("Default");// 创建 FreeSql 实例var fsql = new FreeSqlBuilder().UseConnectionString(DataType.ClickHouse, connectionString).Build();// 插入数据var order = new Order{OrderDate = DateTime.Now,CustomerId = 1,ProductId = 101,Quantity = 2,Price = 19.99m};fsql.Insert(order).ExecuteAffrows();// 查询数据var orders = fsql.Select<Order>().Where(o => o.OrderDate >= new DateTime(2023, 1, 1)).OrderByDescending(o => o.OrderDate).ToList();foreach (var item in orders){Console.WriteLine($"Order ID: {item.Id}, Order Date: {item.OrderDate}, Customer ID: {item.CustomerId}, Product ID: {item.ProductId}, Quantity: {item.Quantity}, Price: {item.Price}");}// 更新数据order.Quantity = 3;fsql.Update<Order>().SetSource(order).ExecuteAffrows();// 删除数据fsql.Delete<Order>().Where(o => o.Id == order.Id).ExecuteAffrows();}}
}

配置文件示例 (appsettings.json):

{"ConnectionStrings": {"Default": "Host=127.0.0.1;Port=9000;Username=default;Password=;Database=default"},"FreeSql": {"Connections": {"Default": {"ConnectionString": "Host=127.0.0.1;Port=9000;Username=default;Password=;Database=default","DbType": "ClickHouse"}}}
}

总结



•    Entity Framework:适合大多数 .NET 项目,特别是需要快速开发和维护的场景。
•    Dapper:适合需要高性能和灵活查询的场景,尤其是高并发应用。
•    NHibernate:适合需要复杂映射和高级功能的大型项目。
•    LLBLGen Pro:适合需要专业级功能和性能优化的商业项目。
•    NPoco 和 RepoDb:适合需要轻量级和高性能的场景,介于 Dapper 和 EF 之间。

•    FreeSQL 适合需要高性能和复杂功能的大型项目。
•    SqlSugar 适合需要快速开发和保持代码简洁的中小型项目。

相关文章:

.NET常用的ORM框架及性能优劣分析总结

市面上有很多流行的 ORM&#xff08;对象关系映射&#xff09;框架可以用于 .NET 开发。本文主要针对以下几种常见的 ORM 框架&#xff0c;对其优劣进行分析及总结&#xff0c;希望能够帮助大家进行ORM框架的使用有所帮助。 1. Entity Framework (EF) 特点 • 官方支持&…...

Ubuntu网络配置(桥接模式, nat模式, host主机模式)

windows上安装了vmware虚拟机&#xff0c; vmware虚拟机上运行着ubuntu系统。windows与虚拟机可以通过三种方式进行通信。分别是桥接模式&#xff1b;nat模式&#xff1b;host模式 一、桥接模式 所谓桥接模式&#xff0c;也就是虚拟机与宿主机处于同一个网段&#xff0c; 宿主机…...

光通信复习

第一章 1.5 光纤通信系统的基本组成是怎么样的&#xff1f;试画出简图予以说明 光纤&#xff1a;主要负责光信号的传输光发送器&#xff1a;将用户端的电信号转化为光信号&#xff0c;入射到光纤内部光中继器&#xff1a;将光纤中发生衰减和畸变的光信号变成没有衰减和畸变的原…...

数字化转型中的投资决策:IT平台投资与业务应用投资的思考

在数字化转型的大潮中&#xff0c;企业常常面临一个核心问题&#xff1a;如何在繁杂的投资决策中精准地分配资源&#xff0c;特别是在IT平台投资和业务应用投资之间&#xff0c;如何合理划分责任与投入&#xff1f;在一些大型企业中&#xff0c;尤其是华为&#xff0c;针对不同…...

Linux快速入门-Linux的常用命令

Linux的常用命令 1. Linux的终端与工作区1.1 终端概述1.2 切换终端 2. Shell语言解释器2.1 Shell概述 3. 用户登录与身份切换3.1 su 命令3.2 sudo 命令 4. 文件、目录操作命令4.1 pwd 命令4.2 cd 命令4.3 ls 命令4.3.1 ls 指令叠加使用 4.4 mkdir 命令4.5 rmdir 命令4.6 cp 命令…...

【ORB-SLAM3:相机针孔模型和相机K8模型】

在ORB-SLAM3中&#xff0c;相机的建模是 SLAM 系统的核心之一&#xff0c;因为它直接影响到如何处理和利用图像数据进行定位和地图构建。ORB-SLAM3 支持不同的相机模型&#xff0c;其中包括针孔模型和鱼眼模型&#xff08;K8 模型&#xff09;。下面分别介绍这两种模型。 相机…...

Python函数(十二):函数的创建和调用、参数传递、返回值

前言&#xff1a;在编程的世界里&#xff0c;函数是一种基本的构建块&#xff0c;它允许我们将代码封装成可重复使用的单元。在Python中&#xff0c;函数的使用尤为重要&#xff0c;因为它不仅有助于代码的模块化&#xff0c;还提高了代码的可读性和可维护性。本章节&#xff0…...

掌握Docker命令与Dockerfile实战技巧:快速构建高效容器化应用

1. 介绍 Docker 是现代开发和运维的必备工具&#xff0c;集成了容器技术的优势。本文将记录 Docker 的常用指令&#xff0c;并会随着使用经验的积累进行不定期更新。 2. 常用命令 2.1 启动容器&#xff08;前台交互模式&#xff09; docker run --privileged --volume /hom…...

Virtualbox硬盘扩容

前言 有没有使用虚拟机安装操作系统的时候&#xff0c;虚拟硬盘一开始分配的虚拟硬盘空间不够用&#xff1f;在后期去扩容的伙伴们&#xff0c;下面我看看如何扩容virtualbox的虚拟硬盘&#xff1f; 重新分配虚拟硬盘大小 在virtualbox菜单选择【管理】-【工具】-【虚拟介质…...

10G光纤反射内存卡

在科技日新月异的今天&#xff0c;数据存储技术正以前所未有的速度发展&#xff0c;其中&#xff0c;“10G光纤反射内存卡”作为新一代存储技术的佼佼者&#xff0c;正逐步引领着数据存储领域的新风尚。本文将深入探讨这一创新产品的技术原理、性能优势、应用场景以及未来展望&…...

信创数据防泄漏中信创沙箱是什么样的安全方案

在信息化与工业化融合创新&#xff08;信创&#xff09;的快速发展中&#xff0c;企业面临着日益复杂的数据安全挑战。SDC沙盒技术以其独特的安全机制和先进的设计理念&#xff0c;为信创环境提供了强有力的数据保护支持。以下是SDC沙盒在信创领域支持能力的几个关键侧重点&…...

虚幻引擎结构之TArray

1.TArray 简介 TArray 是虚幻引擎提供的一个动态数组容器&#xff0c;用于存储相同类型的元素集合。它是一个模板类&#xff0c;能够容纳任意类型的数据&#xff0c;为用户提供了一套简便的方法来添加、删除、访问和操作数组中的元素。作为虚幻引擎的核心数据结构之一&#xff…...

【搭建一个网上商城系统】

搭建一个网上商城系统是一个复杂但有序的过程&#xff0c;涉及多个关键步骤。以下是一些主要的步骤&#xff1a; 确定运营模式 选择适合的模式&#xff1a;根据企业的规模、业务形态和目标市场&#xff0c;选择合适的电商平台运营模式&#xff0c;如B2C&#xff08;商对客&am…...

【gopher的java学习笔记】Spring Boot Starter初探

转到java这边后&#xff0c;这天需要搭一个java的web service出来&#xff0c;如果是以前golang的话&#xff0c;那我就可以非常熟练的用gin搭建一个web service出来&#xff0c;核心逻辑就是写好一些rest接口实现后再加上最为灵魂的一句&#xff1a; // 启动Gin服务器在8080端…...

web服务器之云主机、物理机租用、服务器托管的区别

云主机、物理机租用和服务器托管是三种不同的Web服务器部署方式&#xff0c;它们各有特点&#xff0c;适用于不同需求的用户。以下是这三种服务的区别&#xff1a; 云主机&#xff08;Cloud Hosting&#xff09;&#xff1a; 资源分配&#xff1a;基于虚拟化技术&#xff0c;多…...

centos制作离线安装包

目录 1.yumdownloader与repotrack怎么选择&#xff1f; yumdownloader --resolve repotrack 总结 2.环境准备 3.安装 1.yumdownloader与repotrack怎么选择&#xff1f; yumdownloader --resolve 和 repotrack 都是与 YUM&#xff08;Yellowdog Updater Modified&#xf…...

论文解读——掌纹生成网络 RPG-Palm升级版PCE-Palm

该文章是2023年论文RPG-Palm的升级版 论文&#xff1a;PCE-Palm: Palm Crease Energy Based Two-Stage Realistic Pseudo-Palmprint Generation 作者&#xff1a;Jin, Jianlong and Shen, Lei and Zhang, Ruixin and Zhao, Chenglong and Jin, Ge and Zhang, Jingyun and Ding,…...

Android修行手册 - 移动端几种常用动画方案对比

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…...

16 循环语句——for循环

#字符串是可以进行迭代的 for 循环: for 变量 in 可迭代的东西: 代码 把可迭代的东西中的每一项内容拿出来&#xff0c;挨个的赋值给变量&#xff0c;每一次的赋值都要执行一次循环体(代码) s "你好呀&#xff0c;我叫赛利…...

代码随想录-笔记-其八

让我们开始&#xff1a;动态规划&#xff01; 70. 爬楼梯 - 力扣&#xff08;LeetCode&#xff09; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; class Solution { public:int climbStairs(i…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...