C# (.NET) 的 ORM:概述、比较与示例
对象关系映射(ORM)是一种技术,它允许开发者通过面向对象的代码与数据库交互,从而将 SQL 查询抽象化。在 .NET 生态系统中,有几种流行的 ORM 库,每种都有其优缺点。本文将介绍三种主要工具:Entity Framework Core、Dapper 和 NHibernate,比较它们的性能、易用性,并提供 C# 的实际代码示例。
1. Entity Framework Core (EF Core)
EF Core 是微软的官方 ORM,是 Entity Framework 6 的继承者。它支持 Code First、Database First 和 Model First 方法,并提供了一个强大的 LINQ 提供程序用于构建查询。
优点:
- 高抽象度——SQL 代码量最少。
- 自动迁移和数据库架构管理。
- 支持多种数据库提供程序(SQL Server、PostgreSQL、SQLite、MySQL)。
- 与 ASP.NET Core 深度集成。
缺点:
- 复杂查询时性能下降。
- 加载关联数据时内存消耗较大。
代码示例:
// 模型public class Product{ public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; }}
// 上下文public class AppDbContext : DbContext{ public DbSet<Product> Products { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder options) => options.UseSqlServer("YourConnectionString");}
// 使用using var db = new AppDbContext();var cheapProducts = db.Products .Where(p => p.Price < 100) .OrderBy(p => p.Name) .ToList();2. Dapper
Dapper 是一个轻量级微 ORM,由 Stack Overflow 团队创建。它通过扩展方法扩展了 IDbConnection,并尽可能接近 ADO.NET 工作,从而提供高性能。
优点:
- 极快——几乎与纯 ADO.NET 一样快。
- 内存消耗最小。
- 完全控制 SQL 查询。
- 适用于高负载系统。
缺点:
- 没有自动数据库架构生成。
- 需要手动编写 SQL 查询。
- 缺少变更跟踪(Change Tracking)。
代码示例:
using (var connection = new SqlConnection("YourConnectionString")){ var products = connection.Query<Product>( "SELECT * FROM Products WHERE Price < @Price ORDER BY Name", new { Price = 100 }); // 多个结果集 using (var multi = connection.QueryMultiple("SELECT * FROM Products; SELECT * FROM Categories")) { var prods = multi.Read<Product>(); var cats = multi.Read<Category>(); }}3. NHibernate
NHibernate 是流行的 Java 框架 Hibernate 的移植版本。它提供了完整的类 JPA 方法实现,具有强大的缓存功能并支持复杂的继承层次结构。
优点:
- 先进的缓存系统(一级和二级缓存)。
- 支持延迟加载(Lazy Loading)、HQL(Hibernate Query Language)。
- 通过 XML 或 Fluent API 灵活配置映射。
- 非常适合遗留项目。
缺点:
- 配置复杂,学习曲线陡峭。
- 在简单查询上比 Dapper 和 EF Core 慢。
- 与 EF Core 相比更新较少。