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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/725706.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

课程设计---哈夫曼树的编码与解码(Java详解)

目录 一.设计任务&&要求&#xff1a; 二.方案设计报告&#xff1a; 2.1 哈夫曼树编码&译码的设计原理&#xff1a; 2.3设计目的&#xff1a; 2.3设计的主要过程&#xff1a; 2.4程序方法清单&#xff1a; 三.整体实现源码&#xff1a; 四.运行结果展示&…

SkyWalking 极简入门

1. 概述 1.1 概念 SkyWalking 是什么&#xff1f; FROM Apache SkyWalking 分布式系统的应用程序性能监视工具&#xff0c;专为微服务、云原生架构和基于容器&#xff08;Docker、K8s、Mesos&#xff09;架构而设计。 提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体…

milvus元数据解析工具milvusmetagui介绍使用

简介 milvusmetagui是一款用来对milvus的元数据进行解析的工具&#xff0c;milvus的元数据存储在etcd上&#xff0c;而且经过了序列化&#xff0c;通过etcd-manager这样的工具来查看是一堆二进制乱码&#xff0c;因此开发了这个工具对value进行反序列化解析。 在这里为了方便交…

建材租赁管理系统软件教程,操作简单佳易王租赁管理系统操作教程

建材租赁管理系统软件教程&#xff0c;操作简单佳易王租赁管理系统操作教程 一、软件操作教程 以下软件操作教程以&#xff0c;佳易王租赁管理系统为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 租赁登记&#xff1a; a、租赁登记可以记录日…

sklearn之各类朴素贝叶斯原理

sklearn之贝叶斯原理 前言1 高斯朴素贝叶斯1.1 对连续变量的处理1.2 高斯朴素贝叶斯算法原理 2 多项式朴素贝叶斯2.1 二项分布和多项分布2.2 详细原理2.3 如何判断是否符合多项式贝叶斯 3 伯努利朴素贝叶斯4 类别贝叶斯4 补充朴素贝叶斯4.1 核心原理4.2 算法流程 前言 如果想看…

Python | Leetcode Python题解之第160题相交链表

题目&#xff1a; 题解&#xff1a; class Solution:def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:A, B headA, headBwhile A ! B:A A.next if A else headBB B.next if B else headAreturn A

吴恩达机器学习 第三课 week1 无监督学习算法(上)

目录 01 学习目标 02 无监督学习 03 K-means聚类算法 3.1 K-means聚类算法原理 3.2 k-means算法实现 3.3 利用k-means算法压缩图片 04 总结 01 学习目标 &#xff08;1&#xff09;了解无监督学习算法 &#xff08;2&#xff09;掌握K-means聚类算法实现步骤 &#xff…

it职业生涯规划系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;职业介绍管理&#xff0c;答题管理&#xff0c;试题管理&#xff0c;基础数据管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;在线答题&#xff0…

基于SSM+Jsp的书店仓库管理系统

摘要&#xff1a;仓库作为储存货物的核心功能之一&#xff0c;在整个仓储中具有非常重要的作用&#xff0c;是社会物质生产的必要条件。良好的仓库布局环境能够对货物进入下一个环节前的质量起保证作用&#xff0c;能够为货物进入市场作好准备&#xff0c;在设计中我们根据书店…

基于matlab的RRT算法路径规划(附带案例源码)

文章中的所有案例均为博主手动复现&#xff0c;用于记录博主学习路径规划的过程&#xff0c;如有不妥&#xff0c;欢迎在评论区交流 目录 1 标准RRT1.1 算法原理1.2 演示 2 GBRRT2.1 算法原理2.2 算法演示 3 RRT-STAR3.1 算法原理3.2 算法演示 4 RRT-CONNECT4.1 算法原理4.2 算…

实现农业现代化与乡村振兴战略的融合发展方案

政策背景 “一号文件”精神贯彻 数字乡村试点精神全面实施 工业化思维谋划农业发展 数字乡村建设纳入县级“十四五”发展规划 乡村振兴实施目标 2020年&#xff1a;乡村振兴取得重要进展 2035年&#xff1a;乡村振兴取得决定性进展&#xff0c;农业农村现代化基本实现 205…

在 Ubuntu 18.04.4 LTS上安装 netmap

文章目录 步骤运行配置文件编译安装使用netmap 步骤 sudo su sudo apt-get update sudo apt install build-essential sudo apt-get install -y git sudo apt-get install -y linux-headers-$(uname -r)rootVM-20-6-ubuntu:/home/ubuntu/netmap/LINUX# git clone https://gith…

反激开关电源EMI电路选型及计算

EMI &#xff1a;开关电源对电网或者其他电子产品的干扰 EMI &#xff1a;传导与辐射 共模电感的滤波电路&#xff0c;La和Lb就是共模电感线圈。这两个线圈绕在同一铁芯上&#xff0c;匝数和相位都相 同(绕制反向)。 这样&#xff0c;当电路中的正常电流&#xff08;差模&…

回归算法详解

回归算法详解 回归分析是一类重要的机器学习方法&#xff0c;主要用于预测连续变量。本文将详细讲解几种常见的回归算法&#xff0c;包括线性回归、岭回归、Lasso 回归、弹性网络回归、决策树回归和支持向量回归&#xff08;SVR&#xff09;&#xff0c;并展示它们的特点、应用…

Ubuntu-基础工具配置

基础工具配置 点击左下角 在弹出界面中点击 以下命令都是在上面这个界面执行&#xff08;请大家注意空格&#xff09; 命令输入完后&#xff0c;回车键就是执行,系统会提示输入密码&#xff08;就是你登录的密码&#xff09; 1.安装net工具 &#xff1a;&#xff08;ifconfi…

uniapp 微信小程序自定义分享图片

场景&#xff1a;微信小程序用户&#xff0c;点击小程序里商品的分享按钮时&#xff0c;想要不同的商品展示不用的分享内容&#xff0c;比如分享图片上展示商品的图片、价格等信息。分享的UI图如下&#xff1a; 实现方法&#xff1a; 1. 分享按钮&#xff1a;<button open-…

Mysten Labs宣布推出Walrus:一种去中心化存储和数据可用性协议

Walrus是为区块链应用和自主代理提供的创新去中心化存储网络。Walrus存储系统今天以开发者预览版的形式发布&#xff0c;面向Sui开发者征求反馈意见&#xff0c;并预计很快会向其他Web3社区广泛推广。 通过采用纠删编码创新技术&#xff0c;Walrus能够快速且稳健地将非结构化数…

Day10—Spark SQL基础

Spark SQL介绍 ​ Spark SQL是一个用于结构化数据处理的Spark组件。所谓结构化数据&#xff0c;是指具有Schema信息的数据&#xff0c;例如JSON、Parquet、Avro、CSV格式的数据。与基础的Spark RDD API不同&#xff0c;Spark SQL提供了对结构化数据的查询和计算接口。 Spark …

人工智能指数报告

2024人工智能指数报告&#xff08;一&#xff09;&#xff1a;研发 前言 全面分析人工智能的发展现状。 从2017年开始&#xff0c;斯坦福大学人工智能研究所&#xff08;HAI&#xff09;每年都会发布一份人工智能的研究报告&#xff0c;人工智能指数报告&#xff08;AII&…

网络安全:入侵检测系统的原理与应用

文章目录 网络安全&#xff1a;入侵检测系统的原理与应用引言入侵检测系统简介IDS的工作原理IDS的重要性结语 网络安全&#xff1a;入侵检测系统的原理与应用 引言 在我们的网络安全系列文章中&#xff0c;我们已经涵盖了从SQL注入到端点保护的多个主题。本篇文章将探讨入侵检…