.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…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
WebRTC调研
WebRTC是什么,为什么,如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...
高端性能封装正在突破性能壁垒,其芯片集成技术助力人工智能革命。
2024 年,高端封装市场规模为 80 亿美元,预计到 2030 年将超过 280 亿美元,2024-2030 年复合年增长率为 23%。 细分到各个终端市场,最大的高端性能封装市场是“电信和基础设施”,2024 年该市场创造了超过 67% 的收入。…...
41道Django高频题整理(附答案背诵版)
解释一下 Django 和 Tornado 的关系? Django和Tornado都是Python的web框架,但它们的设计哲学和应用场景有所不同。 Django是一个高级的Python Web框架,鼓励快速开发和干净、实用的设计。它遵循MVC设计,并强调代码复用。Django有…...
EEG-fNIRS联合成像在跨频率耦合研究中的创新应用
摘要 神经影像技术对医学科学产生了深远的影响,推动了许多神经系统疾病研究的进展并改善了其诊断方法。在此背景下,基于神经血管耦合现象的多模态神经影像方法,通过融合各自优势来提供有关大脑皮层神经活动的互补信息。在这里,本研…...
02-性能方案设计
需求分析与测试设计 根据具体的性能测试需求,确定测试类型,以及压测的模块(web/mysql/redis/系统整体)前期要与相关人员充分沟通,初步确定压测方案及具体的性能指标QA完成性能测试设计后,需产出测试方案文档发送邮件到项目组&…...
