.Net框架,除了EF还有很多很多......

在这里插入图片描述

文章目录

    • 1. 引言
    • 2. Dapper
      • 2.1 概述与设计原理
      • 2.2 核心功能与代码示例
        • 基本查询
        • 多映射查询
        • 存储过程调用
      • 2.3 性能优化原理
      • 2.4 适用场景
    • 3. NHibernate
      • 3.1 概述与架构设计
      • 3.2 映射配置示例
        • Fluent映射
        • XML映射
      • 3.3 查询示例
        • HQL查询
        • Criteria API
        • LINQ提供程序
      • 3.4 高级特性
      • 3.5 适用场景
    • 4. ServiceStack.OrmLite
      • 4.1 设计理念
      • 4.2 基本操作示例
        • 配置与连接
        • CRUD操作
        • 高级查询
      • 4.3 特性与扩展
      • 4.4 适用场景
    • 5. LLBLGen Pro
      • 5.1 框架概述
      • 5.2 设计器与代码生成
      • 5.3 查询示例
        • Adapter模式
        • LINQ查询
      • 5.4 性能优化技术
      • 5.5 适用场景
    • 6. PetaPoco
      • 6.1 微型ORM设计
      • 6.2 基本用法
      • 6.3 高级特性
      • 6.4 适用场景
    • 7. RepoDB
      • 7.1 混合ORM设计
      • 7.2 核心操作
        • 基本CRUD
        • 批量操作
      • 7.3 性能特性
      • 7.4 适用场景
    • 8. 框架比较与选型指南
      • 8.1 功能对比表
      • 8.2 性能基准
      • 8.3 选型建议
    • 9. 高级主题与最佳实践
      • 9.1 混合使用多个ORM
      • 9.2 性能优化技巧
      • 9.3 事务管理
        • Dapper事务
        • NHibernate事务
      • 9.4 迁移策略
    • 10. 结论

在这里插入图片描述

1. 引言

Entity Framework (EF)是微软官方推出的.NET ORM框架,但.NET生态系统中还存在许多其他优秀的数据访问框架。本文将全面介绍EF的主要替代方案,包括Dapper、NHibernate、ServiceStack.OrmLite、LLBLGen Pro、PetaPoco等,深入分析它们的原理、架构设计、使用场景,并通过大量代码示例展示它们的实际应用。

2. Dapper

2.1 概述与设计原理

Dapper是由Stack Overflow团队开发的微型ORM框架,其核心设计理念是"轻量级"和"高性能"。与EF不同,Dapper不提供变更跟踪、延迟加载等复杂功能,而是专注于将SQL查询结果快速映射到对象。

Dapper的核心原理:

  • 基于ADO.NET的扩展方法
  • 动态生成IL代码实现高性能映射
  • 无状态设计,不维护对象状态
  • 直接使用SQL,不提供查询翻译层

2.2 核心功能与代码示例

基本查询
using var connection = new SqlConnection(connectionString);
var products = connection.Query<Product>("SELECT * FROM Products WHERE Price > @Price", new { Price = 50 });
多映射查询
var sql = @"SELECT * FROM Orders o INNER JOIN Customers c ON o.CustomerId = c.IdWHERE o.OrderDate > @Date";var orders = connection.Query<Order, Customer, Order>(sql,(order, customer) => { order.Customer = customer; return order; },new { Date = DateTime.Now.AddDays(-30) },splitOn: "Id");
存储过程调用
var parameters = new DynamicParameters();
parameters.Add("@ProductId", 1);
parameters.Add("@Price", dbType: DbType.Decimal, direction: ParameterDirection.Output);connection.Execute("sp_GetProductPrice", parameters, commandType: CommandType.StoredProcedure);var price = parameters.Get<decimal>("@Price");

2.3 性能优化原理

Dapper的性能优势主要来自:

  1. 动态编译:首次查询时会为特定类型生成优化的映射代码
  2. 缓存机制:生成的映射代码会被缓存,避免重复编译
  3. 最小化抽象:几乎不添加额外抽象层,直接操作ADO.NET

2.4 适用场景

  • 需要极致性能的应用程序
  • 已有良好SQL基础,希望直接控制SQL
  • 简单CRUD操作为主的系统
  • 微服务架构中的轻量级数据访问层

3. NHibernate

3.1 概述与架构设计

NHibernate是.NET平台上的成熟ORM框架,移植自Java的Hibernate。它提供了比EF更丰富的功能集和更灵活的配置选项。

NHibernate架构核心:

  • ISession:工作单元模式的实现,管理对象生命周期
  • 映射系统:支持XML、特性或Fluent配置
  • 查询语言:HQL、Criteria API、LINQ
  • 二级缓存:可插拔的缓存实现

3.2 映射配置示例

Fluent映射
public class ProductMap : ClassMap<Product>
{public ProductMap(){Id(x => x.Id);Map(x => x.Name);Map(x => x.Price);References(x => x.Category);HasMany(x => x.OrderItems).Inverse().Cascade.AllDeleteOrphan();}
}
XML映射
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"><class name="Product" table="Products"><id name="Id" column="ProductId"><generator class="identity"/></id><property name="Name" not-null="true"/><property name="Price" type="decimal"/><many-to-one name="Category" column="CategoryId"/><bag name="OrderItems" inverse="true" cascade="all-delete-orphan"><key column="ProductId"/><one-to-many class="OrderItem"/></bag></class>
</hibernate-mapping>

3.3 查询示例

HQL查询
var query = session.CreateQuery("FROM Product p WHERE p.Price > :price").SetDecimal("price", 100m);
var products = query.List<Product>();
Criteria API
var products = session.CreateCriteria<Product>().Add(Restrictions.Gt("Price", 100m)).AddOrder(Order.Asc("Name")).SetMaxResults(10).List<Product>();
LINQ提供程序
var products = session.Query<Product>().Where(p => p.Price > 100m).OrderBy(p => p.Name).Take(10).ToList();

3.4 高级特性

  • 二级缓存:配置EhCache等实现
  • 拦截器:实现IInterceptor自定义操作行为
  • 事件系统:监听和处理持久化事件
  • 批量处理:优化大批量数据操作

3.5 适用场景

  • 复杂领域模型的企业应用
  • 需要跨数据库平台的应用
  • 已有Hibernate经验的团队
  • 需要细粒度控制持久化行为的场景

4. ServiceStack.OrmLite

4.1 设计理念

ServiceStack.OrmLite是ServiceStack套件中的轻量级ORM,设计目标是提供简单、直观的API,同时保持高性能。它采用"约定优于配置"的原则,自动推断大部分映射关系。

核心特点:

  • 基于POCO的无配置映射
  • 支持多种数据库提供程序
  • 简洁的LINQ-like API
  • 与ServiceStack其他组件无缝集成

4.2 基本操作示例

配置与连接
var dbFactory = new OrmLiteConnectionFactory(connectionString, SqlServerDialect.Provider);using var db = dbFactory.Open();
db.CreateTableIfNotExists<Product>();
CRUD操作
// 插入
var product = new Product { Name = "iPad", Price = 499 };
db.Insert(product);
var id = product.Id; // 自动获取自增ID// 查询
var expensiveProducts = db.Select<Product>(p => p.Price > 1000);// 更新
product.Price = 449;
db.Update(product);// 删除
db.Delete<Product>(p => p.Price < 100);
高级查询
var results = db.Select<Product>(q => q.Where(p => p.Price > 100).OrderBy(p => p.Name).Limit(10, 5)); // 分页

4.3 特性与扩展

  • 模式迁移:通过Migrate()方法处理数据库变更
  • 复杂类型支持:JSON/XML序列化存储复杂属性
  • 存储过程支持:通过SqlProc方法调用
  • 多数据库支持:同一代码可运行在不同数据库上

4.4 适用场景

  • 使用ServiceStack构建的Web服务
  • 需要简单快速开发的应用程序
  • 偏好简洁API的项目
  • 需要支持多种数据库的项目

5. LLBLGen Pro

5.1 框架概述

LLBLGen Pro是商业ORM框架,以其强大的设计器和高效运行时著称。它提供三种工作模式:

  1. Adapter模式:类似传统ADO.NET的工作方式
  2. SelfServicing模式:类似EF的主动记录模式
  3. Entity Framework集成:作为EF提供程序

5.2 设计器与代码生成

LLBLGen Pro的核心是其可视化设计器,可以:

  • 逆向工程现有数据库
  • 设计实体关系模型
  • 生成高度优化的数据访问代码
  • 自定义模板控制生成结果

5.3 查询示例

Adapter模式
var adapter = new DataAccessAdapter();
var products = new EntityCollection<ProductEntity>();
var filter = (ProductFields.Price > 100m) & ProductFields.Name.Contains("Pro");
adapter.FetchEntityCollection(products, filter);
LINQ查询
var metaData = new LinqMetaData(adapter);
var query = from p in metaData.Productwhere p.Price > 100morderby p.Nameselect p;
var results = query.ToList();

5.4 性能优化技术

LLBLGen Pro采用多种优化技术:

  • 预编译查询计划
  • 智能批处理
  • 高效的变更跟踪
  • 可配置的获取策略

5.5 适用场景

  • 大型企业应用程序
  • 已有复杂数据库结构的项目
  • 需要可视化设计工具支持的团队
  • 对性能有极高要求的场景

6. PetaPoco

6.1 微型ORM设计

PetaPoco是极简风格的ORM,核心只有一个C#文件。它提供自动POCO映射和基本的CRUD操作,同时支持原始SQL查询。

设计特点:

  • 超轻量级(单个.cs文件)
  • 自动POCO映射
  • 智能参数绑定
  • 简单分页支持

6.2 基本用法

var db = new Database("connectionString");// 查询单个对象
var product = db.SingleOrDefault<Product>("SELECT * FROM Products WHERE Id=@0", 1);// 查询列表
var products = db.Query<Product>("SELECT * FROM Products WHERE Price>@0", 50);// 插入
var newProduct = new Product { Name = "New Product", Price = 99.99m };
db.Insert(newProduct);// 分页
var page = db.Page<Product>(2, 10, "SELECT * FROM Products ORDER BY Name");

6.3 高级特性

  • T4模板支持:生成强类型POCO
  • 多结果集查询:处理存储过程的多个结果集
  • 事务支持:简单的事务API
  • 异步操作:全面的异步方法支持

6.4 适用场景

  • 小型到中型项目
  • 需要简单ORM功能的应用程序
  • 资源受限的环境
  • 快速原型开发

7. RepoDB

7.1 混合ORM设计

RepoDB是Dapper的替代品,结合了微型ORM和完整ORM的特性。它提供:

  • 基于ADO.NET的原始性能
  • 丰富的CRUD操作
  • 批量操作和缓存支持
  • 可扩展的映射系统

7.2 核心操作

基本CRUD
// 插入
var product = new Product { Name = "RepoDemo", Price = 49.99m };
var id = connection.Insert<Product, int>(product);// 查询
var result = connection.Query<Product>(p => p.Price > 10m).ToList();// 更新
product.Price = 59.99m;
connection.Update(product);// 删除
connection.Delete<Product>(p => p.Name == "RepoDemo");
批量操作
var products = new List<Product>();
// 填充products...
connection.InsertAll(products);

7.3 性能特性

  • 批处理:合并多个操作到单个调用
  • 缓存:内置查询结果缓存
  • 预编译:动态编译和缓存表达式树
  • 混合模式:混合使用原始SQL和LINQ

7.4 适用场景

  • 需要比Dapper更多功能但仍需高性能的项目
  • 大量批处理操作的应用程序
  • 需要灵活查询方式的场景

8. 框架比较与选型指南

8.1 功能对比表

特性EF CoreDapperNHibernateOrmLiteLLBLGen ProPetaPocoRepoDB
变更跟踪
LINQ支持有限有限
延迟加载
原始SQL有限
二级缓存扩展
迁移工具扩展有限
性能中等中等
学习曲线中等中等

8.2 性能基准

以下是各框架在常见操作上的相对性能比较(数值越小越好):

操作EF CoreDapperNHibernateOrmLiteLLBLGen ProPetaPocoRepoDB
单对象查询1.2x1.0x1.5x1.1x1.1x1.0x1.0x
多对象查询(20)1.3x1.0x1.6x1.2x1.2x1.1x1.1x
插入单对象1.4x1.0x1.8x1.1x1.2x1.0x1.0x
批量插入(1000)2.0x1.2x2.2x1.3x1.1x1.2x1.0x
复杂查询1.5x1.0x1.7x1.4x1.3x1.1x1.1x

8.3 选型建议

  1. 企业级复杂应用

    • 首选:NHibernate或LLBLGen Pro
    • 理由:功能全面,支持复杂领域模型,有良好的工具支持
  2. 高性能Web应用

    • 首选:Dapper或RepoDB
    • 理由:接近原生ADO.NET的性能,适合大量简单查询
  3. 快速开发中小型项目

    • 首选:ServiceStack.OrmLite或PetaPoco
    • 理由:简单易用,开发效率高
  4. 微服务架构

    • 首选:Dapper或EF Core
    • 理由:Dapper适合简单服务,EF Core适合需要迁移和复杂查询的服务
  5. 已有复杂数据库的项目

    • 首选:LLBLGen Pro或NHibernate
    • 理由:强大的逆向工程和复杂查询支持

9. 高级主题与最佳实践

9.1 混合使用多个ORM

在实际项目中,可以混合使用多个ORM框架以发挥各自优势。例如:

// 使用Dapper处理大量简单查询
public IEnumerable<Product> GetFeaturedProducts()
{using var conn = new SqlConnection(_config.GetConnectionString("Default"));return conn.Query<Product>("SELECT TOP 10 * FROM Products WHERE IsFeatured=1");
}// 使用EF Core处理复杂领域逻辑
public void UpdateProductInventory(int productId, int adjustment)
{using var context = new AppDbContext();var product = context.Products.Include(p => p.Inventory).FirstOrDefault(p => p.Id == productId);product.Inventory.Stock += adjustment;product.Inventory.LastUpdated = DateTime.UtcNow;context.SaveChanges();
}

9.2 性能优化技巧

  1. Dapper优化

    • 使用Buffered=false处理大量数据
    • 预编译参数化查询
    • 合理使用多映射
  2. NHibernate优化

    • 配置适当的抓取策略
    • 使用二级缓存
    • 批处理写操作
  3. 通用优化

    • 限制查询字段(避免SELECT *)
    • 合理使用分页
    • 异步操作

9.3 事务管理

各框架的事务处理示例:

Dapper事务
using var connection = new SqlConnection(connectionString);
connection.Open();using var transaction = connection.BeginTransaction();
try
{connection.Execute("INSERT INTO Orders...", parameters, transaction);connection.Execute("UPDATE Inventory...", parameters, transaction);transaction.Commit();
}
catch
{transaction.Rollback();throw;
}
NHibernate事务
using var session = sessionFactory.OpenSession();
using var transaction = session.BeginTransaction();
try
{session.Save(order);session.Update(inventory);transaction.Commit();
}
catch
{transaction.Rollback();throw;
}

9.4 迁移策略

从EF迁移到其他ORM的注意事项:

  1. 数据模型调整:可能需要修改实体类以符合目标ORM约定
  2. 查询重写:LINQ查询可能需要转换为SQL或其他查询语法
  3. 事务处理:理解不同ORM的事务边界
  4. 性能测试:迁移后进行全面性能测试

10. 结论

.NET生态系统提供了丰富的ORM选择,从全功能的NHibernate到超轻量级的PetaPoco,各有其适用场景。选择ORM时应考虑:

  1. 项目复杂度:简单项目适合微型ORM,复杂领域模型需要全功能ORM
  2. 团队技能:考虑团队对不同ORM的熟悉程度
  3. 性能需求:高性能需求可能倾向Dapper等轻量方案
  4. 长期维护:评估框架的活跃度和社区支持

无论选择哪个框架,理解其底层原理和正确使用模式都是实现高效数据访问的关键。建议从简单需求开始,随着项目复杂度增加逐步评估是否需要更强大的ORM功能。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL:InnoDB架构(内存架构篇)

目录 0.前置知识 0.1二级索引的概念 二级索引查询原理 1.整体架构 1.1为什么innoDB的架构会分为两个部分? 2.内存架构 2.1BufferPool 2.2ChangeBuffer 唯一性检查不是实时性会出现的问题? ChangeBuffer的优势 2.3Adaptive Hash Index 2.4LogBuffer 0.前置知识 0.…

鹰盾加密器“一机一码”技术全维度剖析:从底层实现到生态防护体系

“一机一码”加密技术的深度解析与实现路径 引言 在数字内容版权保护和软件授权管理领域&#xff0c;“一机一码”技术作为一种重要的安全防护手段&#xff0c;能够有效防止授权码滥用和非法传播。它通过建立设备与授权码的唯一对应关系&#xff0c;确保每份授权仅在特定设备…

Android 中使用 OkHttp 创建多个 Client

在 Android 开发中&#xff0c;有时我们需要创建多个 OkHttpClient 实例来满足不同的网络请求需求。以下是创建和管理多个 OkHttpClient 的方法&#xff1a; 基本创建方式 // 创建默认的 OkHttpClient val defaultClient OkHttpClient()// 创建带有自定义配置的 Client val …

C++中的跳转语句

C中的跳转语句包括break、continue和goto&#xff0c;它们用于改变程序的正常执行流程。下面分别介绍它们的作用、使用场景和注意事项&#xff1a; 1. break 作用&#xff1a; • 立即终止当前所在的循环&#xff08;for、while、do while&#xff09;或switch语句&#xff…

AI在网络安全领域的应用现状和实践

当前&#xff0c;人工智能技术已深度融入网络安全产品&#xff0c;推动传统防御模式向智能化、自适应方向加速演进。各安全厂商通过机器学习、深度学习与知识图谱等技术的融合应用&#xff0c;提高安全产品在威胁检测、攻击溯源、风险评估等场景的能力跃迁&#xff0c;突破传统…

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…

Spark 之 DataFrame 开发

foreachPartition val data = spark.sparkContext.parallelize(1 to 100)// 使用 foreachPartition 批量处理分区 data.foreachPartition {partitionIterator =

UDP:简洁高效的报文结构解析与关键注意事项

UDP&#xff08;User Datagram Protocol&#xff09;以其无连接、低开销的特性&#xff0c;成为实时应用&#xff08;如视频、游戏、DNS&#xff09;的首选传输协议。深入理解其报文结构和注意事项&#xff0c;是高效利用UDP的基础。 一、UDP报文结构&#xff1a;简洁的四段式 …

Cursor 工具项目构建指南:让 AI 审查 AI 生产的内容,确保生产的内容质量和提前发现问题

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 Cursor 工具项目构建指南:让 AI 审查 AI 生产的内容,确保生产的内容质量和提前发现问…

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…

企业中使用 MCP Server 实现业务打通

一、MCP 协议深度剖析 (一)技术架构解析 核心价值 MCP(Model Context Protocol)协议的核心价值在于解决 Function Call 的碎片化问题,提供标准化工具连接协议。它通过统一的上下文管理,使大语言模型(LLM)能够高效地访问外部资源、执行复杂任务,并实现与外部系统的动…

自己编写一个神经网络模型识别数字验证码(卷积神经网络的 Hello world)

开篇之前说明一下&#xff1a;本文纯粹是技术交流和探讨&#xff0c;所用数据为非公开数据集&#xff0c;仅限于学习&#xff0c;不可用以商业和其他用途。 一、项目目标 通过构建一个简单的 CNN 神经网络&#xff0c;实现对 数字验证码&#xff08;如 “7384”&#xff09; 的…

常用ADB命令

ADB&#xff1a;Android Debug Bridge&#xff0c;Android 调试桥。 是一个命令行工具&#xff0c;主要用于在开发过程中实现计算机与Android设备之间的通信。 ADB工具允许开发者执行一系列调试操作&#xff0c;如安装应用、管理应用的生命周期、读取日志数据、执行shell命令等…

JavaScript BOM 详细介绍

JavaScript BOM (Browser Object Model) 详细介绍 BOM (Browser Object Model) 是浏览器对象模型&#xff0c;它提供了与浏览器窗口交互的对象和方法&#xff0c;允许 JavaScript 与浏览器"对话"。 1. BOM 概述 BOM 的核心是 window 对象&#xff0c;它代表浏览器…

DeepSeek生成流程图

通过DeepSeek生成代码 请用 Mermaid 语法生成一个电商订单处理流程的流程图&#xff0c;流程包括用户下单、订单审核、库存检查、生成发货单、发货以及各个环节可能出现的分支情况&#xff0c;如订单审核不通过返回修改&#xff0c;库存不足通知用户等 打开在线绘图 Flowchart…

WebGL与Three.js:从基础到应用的关系与原理解析

WebGL 和 Three.js 是现代网页中实现 3D 图形和动画的两大关键技术。尽管它们有着紧密的关系&#xff0c;但它们在功能和使用场景上有所不同。简单来说&#xff0c;WebGL 是一个底层图形库&#xff0c;提供了对计算机 GPU 的直接访问&#xff0c;而 Three.js 则是建立在 WebGL …

Spring Boot消息系统开发指南

消息系统基础概念 消息系统作为分布式架构的核心组件&#xff0c;实现了不同系统模块间的高效通信机制。其应用场景从即时通讯软件延伸至企业级应用集成&#xff0c;形成了现代软件架构中不可或缺的基础设施。 通信模式本质特征 同步通信要求收发双方必须同时在线交互&#…

JavaWeb笔记

六、MVC模式 ✅ Model&#xff08;模型&#xff09; 职责&#xff1a;处理数据和业务逻辑。 负责数据的存储、读取和操作。 包含业务规则和逻辑。 ✅ View&#xff08;视图&#xff09; 职责&#xff1a;展示界面和接收用户输入。 把数据以可视化的形式呈现给用户。 不处…

解决启动SpringBoot是报错Command line is too long的问题

文章目录 错误全称原因解决方法&#xff08;一图到底&#xff09; 错误全称 在启动springBoot项目时&#xff0c;会报错&#xff1a; Error running Application. Command line is too long. Shorten the command line via JAR manifest 原因 命令行太长的原因导致SpringBoot和…

DAY47打卡

DAY 47 注意力热图可视化 昨天代码中注意力热图的部分顺移至今天 知识点回顾&#xff1a;热力图&#xff08;代码学习在day46天&#xff09; 作业&#xff1a;对比不同卷积层热图可视化的结果 通道注意力热图的代码整体结构与核心功能 数据处理&#xff1a;对 CIFAR-10 数据集进…