我是将 Dapper 还是 Entity framework core 用于下一个 .NET 项目?当你必须做出这个决定时,总是令人困惑,为了项目的成功,你需要做出正确的决定。让我来帮你...
介绍
使用 .NET 开发的应用程序可以根据其使用的对象关系映射器 (ORM) 将其分类为“坏”或“好”。因为选择正确的对象关系映射器 (ORM) 会显著影响应用程序的性能、可维护性和可伸缩性。目前,Entity Framework Core (EF Core) 和 Dapper 是 .NET 开发人员中最受欢迎的两个选择。在本文中,我将讨论这两个 ORM 之间的区别,以帮助您为下一个项目做出明智的决定。
Entity Framework Core (EF Core) 和 Dapper 具有相同的基本用途,即通过抽象掉数据库交互的复杂性来简化数据访问,并且它们处于不同的抽象级别。然而,他们以不同的方式这样做,每种方式都有自己的优势和劣势。
为项目选择正确 ORM 的重要性
选择正确的 ORM(对象关系映射器)对于项目的成功非常重要,因为它直接影响性能、开发人员生产力、可维护性、可伸缩性和对数据库交互的控制。当我们为项目选择合适的 ORM 时,我们需要考虑性能要求、项目复杂性以及灵活性和控制需求等因素。通过仔细评估这些因素并选择符合项目目标和需求的 ORM,开发人员可以确保其应用程序的效率、可维护性和可伸缩性。
什么是 EF Core?
实体框架核心是由 Microsoft 为 .NET 应用程序开发的现代轻量级对象关系映射 (ORM) 框架。它允许开发人员使用 .NET 对象处理数据库,从而抽象出许多基础数据库交互。它提供了一组帮助我们使用数据库的功能,包括更改跟踪、LINQ 支持和数据库迁移。
EF Core 是一个功能丰富、可扩展且高度可配置的框架,它通过抽象出许多复杂性并直接使用数据库来简化数据访问,使其成为具有复杂数据模型和关系的项目的绝佳选择。
下面是 EF Core 的示例代码。
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;
namespace Test;
public class ApplicationDbContext : DbContext
{
public DbSet<Blog> User { get; set; }
public DbSet<Post> Department { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
}
}
public class User
{
public int UserId { get; set; }
public string FullName{ get; set; }
public int Age{ get; set; }
public int DepartmentId { get; set; }
public Department Department { get; set; }
}
public class Department
{
public int DepartmentId { get; set; }
public string Name { get; set; }
public List<User> Users { get; set; }
}
您必须确保在 or 文件中定义了连接字符串。appsettings.jsonappsettings.{Environment}.json
{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=YourDB;Trusted_Connection=True;ConnectRetryCount=0"
}
}
然后,在应用程序启动类(通常)中,将 Entity Framework Core 配置为使用应用程序设置中的连接字符串,并使用依赖项注入进行注册。Startup.csApplicationDbContext
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Configuration;
namespace TestProject
{
public class Startup
{
public IConfiguration Configuration { get; }
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public void ConfigureServices(IServiceCollection services)
{
// Configure DbContext with connection string from app settings
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
}
}
}
可以使用集成查询 (LINQ) 语言从数据库中检索这些实体类的实例。
using (var db = new ApplicationDbContext())
{
var users = db.User
.Where(u => u.age > 20)
.OrderBy(u => u.FullName)
.ToList();
}
使用实体类的实例在数据库中创建、删除和修改数据。这是将数据保存到数据库的方法。
using (var db = new ApplicationDbContext())
{
var department = new Department { Name = "TestDepartment" };
db.Department.Add(department);
db.SaveChanges();
}
什么是Dapper?
Dapper 是专为 .NET 生态系统构建的轻量级高性能微 ORM。它由 Stack Overflow 团队开发,与 EF Core 相比,它更轻量级。Dapper 由用于执行原始 SQL 查询的辅助函数组成,提供了一种性能优化、直接的数据访问方法。它专注于简单性和性能,以最小的开销提供 SQL 查询到 .NET 对象的直接映射。Dapper 非常适合原始性能至关重要的场景,例如高并发环境或具有大型数据集的应用程序。
下面是 Dapper 的示例代码。
首先定义我们需要的类。
public class User
{
public int UserId { get; set; }
public string FullName{ get; set; }
public int Age{ get; set; }
public int DepartmentId { get; set; }
public Department Department { get; set; }
}
public class Department
{
public int DepartmentId { get; set; }
public string Name { get; set; }
public List<User> Users { get; set; }
}
这就是实现 CRUD 操作的方法。
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using Dapper;
public class UserRepository
{
private readonly SqlConnection _connection;
public UserRepository(SqlConnection connection)
{
_connection = connection ?? throw new ArgumentNullException(nameof(connection));
}
public void Insert(User user)
{
_connection.Execute("INSERT INTO Users (FullName, Age, DepartmentId) VALUES (@FullName, @Age, @DepartmentId)", user);
}
public User GetById(int userId)
{
return _connection.QueryFirstOrDefault<User>("SELECT * FROM Users WHERE UserId = @UserId", new { UserId = userId });
}
public void Update(User user)
{
_connection.Execute("UPDATE Users SET FullName = @FullName, Age = @Age, DepartmentId = @DepartmentId WHERE UserId = @UserId", user);
}
public void Delete(int userId)
{
_connection.Execute("DELETE FROM Users WHERE UserId = @UserId", new { UserId = userId });
}
}
比较 Dapper VS 实体框架
易用性
EF Core 允许开发人员使用 C# 类定义数据库架构,并提供与 LINQ 的无缝集成,使数据查询更加直观。它内置了对数据库迁移和架构管理的支持。
另一方面,对于 dapper,它需要编写原始 SQL 查询,这对于熟悉 SQL 的人来说可能更直观。对于简单的 CRUD 操作,通常需要较少的样板代码。
性能
使用 EF 核心时,抽象层和其他功能可能会引入性能开销。EF Core 提供延迟加载,这意味着根据用例,它既可以是优点,也可以是缺点。但是,它提供了兑现和其他性能优化功能,有时使 EF Core 更快。
Dapper 通常比 EF Core 更快,并且以高性能数据访问而闻名,因为它使用原始 SQL 查询。在这里,它的最小抽象层意味着更少的开销。
复杂性
Dapper 设计简单轻便。它不像 EF Core 那样抽象 SQL 查询或数据库操作,这意味着开发人员可以更好地控制他们编写的 SQL 查询。这种简单性可以降低复杂性,特别是对于喜欢编写 SQL 的开发人员。
Entity Framework Core 抽象出大部分数据库交互,提供更高级别的构造,如 DbSet、LINQ 查询和自动更改跟踪。在某些情况下,这种抽象可能会导致复杂性增加,尤其是在处理复杂的数据库架构或性能优化时。但是,它也提供了生产力优势,特别是对于喜欢使用对象而不是原始 SQL 的开发人员。
数据库支持
Dapper 支持广泛的数据库提供程序,包括 SQL Server、MySQL、PostgreSQL、SQLite、Oracle 等。但是,EF Core 支持更多数据库,包括 SQLite、Oracle 和 IBM DB2。
灵活性
EF Core 具有高度可配置性和可扩展性,这意味着它允许广泛的自定义,并且内置支持多个数据库提供程序。EF Core 提供了一种更加结构化的数据访问方法,可以更轻松地在大型项目中使用。
但是,Dapper 提供了比 EF Core 更大的灵活性,因为它允许执行原始 SQL 查询并将结果映射到 .NET 对象。它专注于一件事,并且做得很好(数据访问)。由于您编写的是原始 SQL,因此您可以完全控制查询。
社区和支持
由于 EF Core 是 Microsoft 产品,因此它拥有强大的社区和广泛的文档。我们会定期更新新功能和性能改进。
对于 Dapper 来说,它比 EF Core 小,但社区很活跃并且不断壮大。足够的文档,并且有大量的第三方教程。
高级功能
EF Core 提供了一组高级功能,例如自动跟踪对实体的更改并在数据库中更新它们、关系、延迟加载、迁移和查询转换。它还内置了对管理复杂关系、事务和联接的支持。
Dapper 支持批量查询和多个结果集。调用存储过程和映射结果很容易。它可能没有 EF Core 提供的高级功能,例如自动更改跟踪、延迟加载和复杂的查询转换,因为 Dapper 专注于原始性能和简单性。但是,Dapper 为执行原始 SQL 查询和有效地将结果映射到对象提供了出色的支持。
其他资源
-
Entity Framework Core 文档
-
Dapper 教程
在为 .NET 项目选择 Dapper 和 Entity Framework Core 时,必须考虑各种因素,例如易用性、性能、复杂性、数据库支持、灵活性、社区支持和高级功能。
最终,Dapper 和 EF Core 之间的选择取决于你的项目要求、团队专业知识、性能注意事项以及对生产力与控制的偏好。这两个框架都有其优点和缺点,因此必须根据您的特定需求对其进行评估,以便为您的项目成功做出明智的决定。
如果你喜欢我的文章,请给我一个赞!谢谢