C# (.NET) 的 ORM:Entity Framework、Dapper 和 NHibernate 对比

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

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

开始课程

用于C# (.NET)的ORM:Entity Framework Core、Dapper和NHibernate对比



在开发C# (.NET)应用程序时,选择合适的ORM(对象关系映射)会显著影响性能、开发速度和代码的可维护性。本文将详细对比.NET生态系统中最流行的三种ORM:Entity Framework Core(EF Core)、Dapper 和 NHibernate。您将了解它们的优缺点,并看到具体的代码示例。



什么是ORM,为什么需要它?

ORM是一种技术,允许通过编程语言的对象而不是直接使用SQL查询来操作数据库。对于C# (.NET),ORM自动化了表到类的映射、SQL生成、变更跟踪和事务管理。这加快了开发速度,但如果使用不当,可能会导致性能损失。



1. Entity Framework Core(EF Core)

EF Core是微软开发的现代化、轻量级且可扩展的Entity Framework版本。它是一个功能完整的ORM,拥有强大的LINQ提供程序、自动迁移功能以及对多种数据库系统(SQL Server、PostgreSQL、SQLite、MySQL等)的支持。



优点:

  • 通过Code-First和Database-First方法实现高开发速度。
  • 强大的LINQ语法用于编写查询。
  • 自动变更跟踪(Change Tracker)。
  • 内置的迁移支持。


缺点:

  • 与微ORM相比速度较慢(由于跟踪的开销)。
  • 复杂查询优化困难(N+1问题)。


代码示例(EF Core):

// 模型public class User{    public int Id { get; set; }    public string Name { get; set; }    public string Email { get; set; }}

// 数据库上下文public class AppDbContext : DbContext{ public DbSet<User> Users { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer(@"Server=(localdb)\\mssqllocaldb;Database=MyDb;"); }}

// 使用using (var db = new AppDbContext()){ // 添加 db.Users.Add(new User { Name = "伊万", Email = "ivan@example.com" }); db.SaveChanges(); // 通过LINQ查询 var users = db.Users.Where(u => u.Name.StartsWith("伊")).ToList(); // 输出 foreach (var user in users) { Console.WriteLine($"{user.Id}: {user.Name}"); }}


2. Dapper

Dapper是一个由Stack Overflow团队创建的微ORM。它几乎不增加额外开销,直接与ADO.NET协作。Dapper非常适合性能至关重要且需要对SQL进行完全控制的项目。



优点:

  • 最大性能(接近于“裸”ADO.NET查询)。
  • 简单且极简(一个文件,几个扩展方法)。
  • 对SQL查询的完全控制。
  • 易于集成到现有项目中。


缺点:

  • 无变更跟踪(所有操作需手动处理)。
  • 无自动迁移。
  • 需要手动编写SQL查询。


代码示例(Dapper):

public class User{    public int Id { get; set; }    public string Name { get; set; }    public string Email { get; set; }}

// 使用Dapperusing (var connection = new SqlConnection(@"Server=(localdb)\\mssqllocaldb;Database=MyDb;")){ connection.Open(); // 插入 var sqlInsert = "INSERT INTO Users (Name, Email) VALUES (@Name, @Email)"; connection.Execute(sqlInsert, new { Name = "彼得", Email = "petr@example.com" }); // 查询

推荐