C# (.NET) 的 ORM:比较与使用示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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 相比更新较少。


代码示例:

推荐