.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 适合需要快速开发和保持代码简洁的中小型项目。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/942322.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年12月英语六级CET6写作与翻译笔记

目录 1 写作 1.1 大学为学生提供了探索各种可能性 1.2 自律在个人成长中的重要性 1.3 切实可行的目标 2 翻译 2.1 洋山港(Yangshan Port) 2.2 中国航天事业 2.3 北斗卫星导航系统 1 写作 1.1 大学为学生提供了探索各种可能性 1.2 自律在个人成长中的重要性 1.3 切实可…

Unity性能优化 --- 减少OverDraw

OverDraw(过度绘制)就是GPU多次重复绘制同一像素点的操作。在Unity 中渲染的图像由数百万个像素组成&#xff0c;如果这些像素被多次绘制&#xff0c;那么会造成GPU极大的性能损耗。例如下图多个物体叠加放在一起 注&#xff1a;棕色越深的地方&#xff0c;过度绘制的次数越多。…

PostgreSQL 的历史

title: PostgreSQL 的历史 date: 2024/12/23 updated: 2024/12/23 author: cmdragon excerpt: PostgreSQL 是一款功能强大且广泛使用的开源关系型数据库管理系统。其历史可以追溯到1986年,当时由加州大学伯克利分校的一个研究团队开发。文章将深入探讨 PostgreSQL 的起源、…

python学opencv|读取图像(二十一)使用cv2.circle()绘制圆形进阶

【1】引言 前序已经掌握了使用cv2.circle()绘制圆形的基本操作&#xff0c;相关链接为&#xff1a; python学opencv|读取图像&#xff08;二十&#xff09;使用cv2.circle()绘制圆形-CSDN博客 由于圆形本身绘制起来比较简单&#xff0c;因此可以自由操作的空间也就大&#x…

大数据-256 离线数仓 - Atlas 数据仓库元数据管理 正式安装 启动服务访问 Hive血缘关系导入

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; 目前开始更新 MyBatis&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff0…

保险科技“数智化+”赋能险企高质量发展

文 / 太保科技有限公司人工智能服务事业群资深产品经理 娄昕盛 中国太平洋保险(集团)股份有限公司数智研究院人工智能首席专家 徐国强 中国太平洋保险(集团)股份有限公司数智研究院执行院长 王磊 近年来,保险科技正处在“数字化+”向“数智化+”发展的过渡阶段,…

AI科研助手开发总结:向量与数据权应用(二)

一、前言 继上篇文章&#xff1a;AI科研助手开发总结&#xff1a;向量与数据权限的应用&#xff08;一&#xff09; 本章根据向量库内存储数据及权限&#xff0c;向量库统一维护和管理数据权限方案讨论。 二、方案分析-基于向量Fields 2.1 思路 结合橙语AI科研助手的业务场…

数字逻辑(七)——逻辑运算中三种基本运算及其符合运算

目录 1 三种基本逻辑运算 1.1 与&#xff08;AND&#xff09; 1.2 或&#xff08;OR&#xff09; 1.3 非&#xff08;NOT&#xff09; 2 由基本门电路组成的其他门电路 2.1 异或 2.2. 同或 2.3 与非 2.4 或非 用于分析数字电路中逻辑功能的数学方法——逻辑代数&#…

分布式事务的解决方案(欢迎讨论~)

目录 背景 CAP定理 BASE理论 场景重现​编辑 分布式事务常见的解决分案 1.二段提交 2.三段提交 3.TCC模式 4.分布式补偿事务&#xff08;Saga&#xff09; 5.Seata分布式框架-XA模式 6.Seata分布式框架-AT模式 XA AT TCC SAGA 的对比 背景 首先必须介绍一下分布式中…

汽车IVI中控开发入门及进阶(43):NanoVG

NanoVG:基于OpenGL的轻量级抗锯齿2D矢量绘图库 NanoVG是一个跨平台、基于OpenGL的矢量图形渲染库。它非常轻量级,用C语言实现,代码不到5000行,非常精简地实现了一套HTML5 Canvas API,做为一个实用而有趣的工具集,用来构建可伸缩的用户界面和可视化效果。NanoVG-Library为…

从0到1实现一个RS蓝图系统-概念提出技术栈选型

请不要自我设限&#xff0c;真正好的人生态度&#xff0c;是现在就做&#xff0c;不等、不靠、不懒惰。 ——小野《改变力》 一、什么是蓝图&#xff1f; 蓝图(BluePrint) 是Epic Games 针对虚幻4引擎开发的可视化脚本语言。当你使用蓝图的时候&#xff0c;其实就是在编写代码…

【C++ 类和对象 基础篇】—— 抽象思维的巅峰舞者,演绎代码的深邃华尔兹

C学习笔记&#xff1a; C 进阶之路__Zwy的博客-CSDN博客 各位于晏&#xff0c;亦菲们&#xff0c;请点赞关注&#xff01; 我的个人主页&#xff1a; _Zwy-CSDN博客 目录 1、类 1.1、类的定义 1.2、访问限定符 1.2.1、public 1.2.2、private 1.2.3、protected 1.3、…

(高可用版本)Kubeadm+Containerd+keepalived部署高可用k8s(v1.28.2)集群

KubeadmContainerdkeepalived部署高可用k8s(v1.28.2)集群 一.环境准备&#xff0c;二.容器运行时Containerd安装请参照前文。KubeadmContainerd部署k8s(v1.28.2)集群&#xff08;非高可用版&#xff09;-CSDN博客 文章目录 KubeadmContainerdkeepalived部署高可用k8s(v1.28.2)集…

联合目标检测与图像分类提升数据不平衡场景下的准确率

联合目标检测与图像分类提升数据不平衡场景下的准确率 在一些数据不平衡的场景下&#xff0c;使用单一的目标检测模型很难达到99%的准确率。为了优化这一问题&#xff0c;适当将其拆解为目标检测模型和图像分类模型的组合&#xff0c;可以更有效地控制最终效果&#xff0c;尤其…

C++之红黑树模拟实现

目录 红黑树的概念 红黑树的性质 红黑树的查找效率 红黑树的实现 红黑树的定义 红黑树节点的插入 红黑树的平衡调整 判断红黑树是否平衡 红黑树整体代码 测试代码 上期我们学习了AVL树的模拟实现&#xff0c;在此基础上&#xff0c;我们本期将学习另一个数据结构-…

机器学习常用术语

目录 概要 机器学习常用术语 1、模型 2、数据集 3、样本与特征 4、向量 5、矩阵 6、假设函数与损失函数 7、拟合、过拟合与欠拟合 8、激活函数(Activation Function) 9、反向传播(Backpropagation) 10、基线(Baseline) 11、批量(Batch) 12、批量大小(Batch Size)…

nest 学习3

学习小册(nest通关秘籍) 邮箱验证码登陆 流程图&#xff1a; 邮箱作为key&#xff0c;生成随机验证码&#xff0c;然后放到redis中。调用邮箱api发送邮箱。 前端获取到code后&#xff0c;将验证码输入传给后端&#xff0c;后端根据邮箱取出redis数据&#xff0c;比对验证码&…

原点安全再次入选信通院 2024 大数据“星河”案例

近日&#xff0c;中国信息通信研究院和中国通信标准化协会大数据技术标准推进委员会&#xff08;CCSA TC601&#xff09;共同组织开展的 2024 大数据“星河&#xff08;Galaxy&#xff09;”案例征集活动结果正式公布。由工银瑞信基金管理有限公司、北京原点数安科技有限公司联…

RabbitMQ 的7种工作模式

RabbitMQ 共提供了7种⼯作模式,进⾏消息传递,. 官⽅⽂档:RabbitMQ Tutorials | RabbitMQ 1.Simple(简单模式) P:⽣产者,也就是要发送消息的程序 C:消费者,消息的接收者 Queue:消息队列,图中⻩⾊背景部分.类似⼀个邮箱,可以缓存消息;⽣产者向其中投递消息,消费者从其中取出消息…

Restaurants WebAPI(四)——Identity

文章目录 项目地址一、Authentication&#xff08;身份认证&#xff09;1.1 配置环境(解决类库包无法引用)1.2 使用Authentication控制Controller的访问1.3 获取User的Context1.3.1 在Application下创建User文件夹1. 创建User.cs record类封装角色信息2. 创建UserContext.cs提供…