项目中选择Entity Framework Core还是Dapper?

我是将 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 之间的选择取决于你的项目要求、团队专业知识、性能注意事项以及对生产力与控制的偏好。这两个框架都有其优点和缺点,因此必须根据您的特定需求对其进行评估,以便为您的项目成功做出明智的决定。

如果你喜欢我的文章,请给我一个赞!谢谢

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 ABP 应用程序,您可以使用 DapperEntity Framework Core 两种 ORM 工具之一,或者甚至可以同时使用它们来访问数据库。以下是如何在 ABP 应用程序同时使用 DapperEntity Framework Core 的步骤: 1.添加 DapperEntity Framework Core 的依赖项 在您的 ABP 应用程序,您需要添加 DapperEntity Framework Core 的依赖项。您可以通过 NuGet 包管理器或手动编辑项目文件添加这些依赖项。添加 DapperEntity Framework Core 的依赖项后,您需要在 `Startup.cs` 文件配置它们。 2.配置 DapperEntity Framework Core 在 `Startup.cs` 文件,您需要配置 DapperEntity Framework Core。以下是一个示例: ```csharp public void ConfigureServices(IServiceCollection services) { // Add Dapper services.AddScoped<IDbConnection>(x => new SqlConnection(Configuration.GetConnectionString("Default"))); // Add Entity Framework Core services.AddAbpDbContext<MyProjectDbContext>(options => { options.AddDefaultRepositories(includeAllEntities: true); }); } ``` 在上面的代码,我们使用 `AddScoped` 方法将 `IDbConnection` 注册为一个服务,并指定使用 `SqlConnection` 类创建连接。然后,我们使用 `AddAbpDbContext` 方法将 `MyProjectDbContext` 注册为一个服务,并指定包含所有实体。 3.编写 DapperEntity Framework Core 的查询 在您的应用程序,您可以使用 DapperEntity Framework Core 的查询来访问数据库。以下是一个示例: ```csharp public class MyService : ITransientDependency { private readonly IDbConnection _connection; private readonly IRepository<MyEntity> _repository; public MyService(IDbConnection connection, IRepository<MyEntity> repository) { _connection = connection; _repository = repository; } public async Task<MyEntity> GetEntity(int id) { // Use Dapper var entity = await _connection.QueryFirstOrDefaultAsync<MyEntity>("SELECT * FROM MyEntities WHERE Id = @Id", new { Id = id }); // Use Entity Framework Core entity = await _repository.GetAsync(id); return entity; } } ``` 在上面的代码,我们注入 `IDbConnection` 和 `IRepository<MyEntity>`,并在 `GetEntity` 方法使用它们来执行 DapperEntity Framework Core 的查询。 需要注意的是,使用 DapperEntity Framework Core 的查询时,您需要务必遵循正确的事务处理和连接管理方式,以确保应用程序的数据完整性和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值