.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(对象关系映射)框架可以用于 .NET 开发。本文主要针对以下几种常见的 ORM 框架,对其优劣进行分析及总结,希望能够帮助大家进行ORM框架的使用有所帮助。 1. Entity Framework (EF) 特点 • 官方支持&…...
Ubuntu网络配置(桥接模式, nat模式, host主机模式)
windows上安装了vmware虚拟机, vmware虚拟机上运行着ubuntu系统。windows与虚拟机可以通过三种方式进行通信。分别是桥接模式;nat模式;host模式 一、桥接模式 所谓桥接模式,也就是虚拟机与宿主机处于同一个网段, 宿主机…...
光通信复习
第一章 1.5 光纤通信系统的基本组成是怎么样的?试画出简图予以说明 光纤:主要负责光信号的传输光发送器:将用户端的电信号转化为光信号,入射到光纤内部光中继器:将光纤中发生衰减和畸变的光信号变成没有衰减和畸变的原…...
数字化转型中的投资决策:IT平台投资与业务应用投资的思考
在数字化转型的大潮中,企业常常面临一个核心问题:如何在繁杂的投资决策中精准地分配资源,特别是在IT平台投资和业务应用投资之间,如何合理划分责任与投入?在一些大型企业中,尤其是华为,针对不同…...
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中,相机的建模是 SLAM 系统的核心之一,因为它直接影响到如何处理和利用图像数据进行定位和地图构建。ORB-SLAM3 支持不同的相机模型,其中包括针孔模型和鱼眼模型(K8 模型)。下面分别介绍这两种模型。 相机…...
Python函数(十二):函数的创建和调用、参数传递、返回值
前言:在编程的世界里,函数是一种基本的构建块,它允许我们将代码封装成可重复使用的单元。在Python中,函数的使用尤为重要,因为它不仅有助于代码的模块化,还提高了代码的可读性和可维护性。本章节࿰…...
掌握Docker命令与Dockerfile实战技巧:快速构建高效容器化应用
1. 介绍 Docker 是现代开发和运维的必备工具,集成了容器技术的优势。本文将记录 Docker 的常用指令,并会随着使用经验的积累进行不定期更新。 2. 常用命令 2.1 启动容器(前台交互模式) docker run --privileged --volume /hom…...
Virtualbox硬盘扩容
前言 有没有使用虚拟机安装操作系统的时候,虚拟硬盘一开始分配的虚拟硬盘空间不够用?在后期去扩容的伙伴们,下面我看看如何扩容virtualbox的虚拟硬盘? 重新分配虚拟硬盘大小 在virtualbox菜单选择【管理】-【工具】-【虚拟介质…...
10G光纤反射内存卡
在科技日新月异的今天,数据存储技术正以前所未有的速度发展,其中,“10G光纤反射内存卡”作为新一代存储技术的佼佼者,正逐步引领着数据存储领域的新风尚。本文将深入探讨这一创新产品的技术原理、性能优势、应用场景以及未来展望&…...
信创数据防泄漏中信创沙箱是什么样的安全方案
在信息化与工业化融合创新(信创)的快速发展中,企业面临着日益复杂的数据安全挑战。SDC沙盒技术以其独特的安全机制和先进的设计理念,为信创环境提供了强有力的数据保护支持。以下是SDC沙盒在信创领域支持能力的几个关键侧重点&…...
虚幻引擎结构之TArray
1.TArray 简介 TArray 是虚幻引擎提供的一个动态数组容器,用于存储相同类型的元素集合。它是一个模板类,能够容纳任意类型的数据,为用户提供了一套简便的方法来添加、删除、访问和操作数组中的元素。作为虚幻引擎的核心数据结构之一ÿ…...
【搭建一个网上商城系统】
搭建一个网上商城系统是一个复杂但有序的过程,涉及多个关键步骤。以下是一些主要的步骤: 确定运营模式 选择适合的模式:根据企业的规模、业务形态和目标市场,选择合适的电商平台运营模式,如B2C(商对客&am…...
【gopher的java学习笔记】Spring Boot Starter初探
转到java这边后,这天需要搭一个java的web service出来,如果是以前golang的话,那我就可以非常熟练的用gin搭建一个web service出来,核心逻辑就是写好一些rest接口实现后再加上最为灵魂的一句: // 启动Gin服务器在8080端…...
web服务器之云主机、物理机租用、服务器托管的区别
云主机、物理机租用和服务器托管是三种不同的Web服务器部署方式,它们各有特点,适用于不同需求的用户。以下是这三种服务的区别: 云主机(Cloud Hosting): 资源分配:基于虚拟化技术,多…...
centos制作离线安装包
目录 1.yumdownloader与repotrack怎么选择? yumdownloader --resolve repotrack 总结 2.环境准备 3.安装 1.yumdownloader与repotrack怎么选择? yumdownloader --resolve 和 repotrack 都是与 YUM(Yellowdog Updater Modified…...
论文解读——掌纹生成网络 RPG-Palm升级版PCE-Palm
该文章是2023年论文RPG-Palm的升级版 论文:PCE-Palm: Palm Crease Energy Based Two-Stage Realistic Pseudo-Palmprint Generation 作者: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 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分…...
16 循环语句——for循环
#字符串是可以进行迭代的 for 循环: for 变量 in 可迭代的东西: 代码 把可迭代的东西中的每一项内容拿出来,挨个的赋值给变量,每一次的赋值都要执行一次循环体(代码) s "你好呀,我叫赛利…...
代码随想录-笔记-其八
让我们开始:动态规划! 70. 爬楼梯 - 力扣(LeetCode) 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? class Solution { public:int climbStairs(i…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...
