.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…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...

nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...

ZYNQ学习记录FPGA(一)ZYNQ简介
一、知识准备 1.一些术语,缩写和概念: 1)ZYNQ全称:ZYNQ7000 All Pgrammable SoC 2)SoC:system on chips(片上系统),对比集成电路的SoB(system on board) 3)ARM:处理器…...