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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java | Leetcode Java题解之第168题Excel表列名称

题目&#xff1a; 题解&#xff1a; class Solution {public String convertToTitle(int columnNumber) {StringBuffer sb new StringBuffer();while (columnNumber ! 0) {columnNumber--;sb.append((char)(columnNumber % 26 A));columnNumber / 26;}return sb.reverse().t…

【APP移动端性能测试】第一节.APP应用架构、环境和敏捷开发模型介绍

文章目录 前言一、APP应用架构二、APP项目环境 2.1 后端项目环境 2.2 前端项目环境三、Scrum敏捷开发模型 3.1 Scrum敏捷模型基础介绍 3.2 Scrum敏捷开发开发流程总结 前言 一、APP应用架构 &#xff08;1&#xff09;APP应用架构 &#xff08;2&#xff0…

springboot应用cpu飙升的原因排除

1、通过top或者jps命令查到是那个java进程&#xff0c; top可以看全局那个进程耗cpu&#xff0c;而jps则默认是java最耗cpu的&#xff0c;比如找到进程是196 1.1 top (推荐)或者jps命令均可 2、根据第一步获取的进程号&#xff0c;查询进程里那个线程最占用cpu&#xff0c;发…

js 用正则表达式 匹配自定义字符之间的字符串数据,如:( )、[ ]、{ }、< >、【】等括号之间的字符串数据

要使用正则表达式匹配尖括号()之间的数据&#xff0c;可以使用以下代码示例&#xff1a; 在JavaScript中&#xff0c;你可以使用正则表达式来匹配括号()之间的数据。以下是一个简单的例子&#xff0c;它展示了如何使用正则表达式来获取两对括号之间的文本。 // 示例字符串 con…

LENOVO联想 小新 16 IAH8 2023款(83BG)笔记本原厂Windows11系统,恢复出厂开箱状态预装OEM系统镜像安装包下载

适用型号&#xff1a;小新 16 IAH8【83BG】 链接&#xff1a;https://pan.baidu.com/s/18VbGbBXtQEW5P8wLIyJtAQ?pwddv1s 提取码&#xff1a;dv1s 联想原装Win11系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、系统属性专属LOGO标志、Office办公软件、联想电脑管家…

董宇辉的人生关键词:年轻人的成长指南

在当今这个信息爆炸、竞争激烈的社会中&#xff0c;年轻人面临着前所未有的挑战与机遇。如何从纷繁复杂的世界中找到属于自己的道路&#xff1f;近日&#xff0c;知名人生导师董宇辉为年轻人提出了几个人生关键词&#xff0c;这些词汇不仅凝聚了他多年的人生感悟&#xff0c;更…

【STM32-ST-Link】

STM32-ST-Link ■ ST-Link简介■ ST-Link驱动的安装。■ ST-Link编程软件(MDK)配置。■ ST-Link固件升级方法 ■ ST-Link简介 由于德产 J-LINK 价格非常昂贵&#xff0c; 而国产 J-LINK 因为版权问题将在万能的淘宝销声匿迹。 所以我们有必要给大家介绍 JTAG/SWD 调试工具中另…

如何做好技术管理与技术规划?

一、背景 做好技术管理不仅要求紧跟行业前沿动态&#xff0c;同时也需把握好产品开发的阶段性分期&#xff0c;确保技术成果转化和产品落地的顺畅进行。技术管理的成功与否&#xff0c;在很大程度上取决于能否精准捕捉市场需求&#xff0c;据此调整任务优先级。面对瞬息万变的…

Day10—Spark SQL基础

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

IDEA上MySQL的jar包导入教程

jar包下载网址——》https://mvnrepository.com/ 1.进入界面&#xff0c;点击搜索框&#xff0c;搜索mysql&#xff1a; 外国网站&#xff0c;可能有点慢,耐心等待即可。 2.点击查询结果&#xff1a; 进入界面&#xff0c;点击前两个结果的其中一个&#xff0c;两个都可以 …

计算机毕业设计Python+Vue.js+Flask+Scrapy电影大数据分析 电影推荐系统 电影爬虫可视化 电影数据分析 大数据毕业设计 协同过滤算法

开发技术 协同过滤算法、机器学习、vue.js、echarts、Flask、Python、MySQL 创新点 协同过滤推荐算法、爬虫、数据可视化 补充说明 两种Python协同过滤推荐算法集成 (ItemCF推荐算法 和 UserCF 推荐算法) 2.专业美工整体设计的细腻的酷黑主题&#xff0c;前后端分离一体化系统&…

leetCode-hot100-链表专题

leetCode-hot100-链表专题 链表简介单链表单链表的使用例题206.反转链表19.删除链表的倒数第N个结点24.两两交换链表中的节点25.K个一组翻转链表 双向链表双向链表的使用 循环链表61.旋转链表141.环形链表142.环形链表Ⅱ LinkedListLinkedList的使用 链表简介 参考博客&#x…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《协同考虑空气质量与热舒适度的空调系统双层优化控制策略》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

数据资产安全保卫战:构建多层次、全方位的数据安全防护体系,守护企业核心数据资产安全

一、引言 在信息化时代&#xff0c;数据资产已成为企业运营的核心&#xff0c;其安全性直接关系到企业的生存与发展。然而&#xff0c;随着网络技术的飞速发展&#xff0c;数据泄露、黑客攻击等安全威胁日益增多&#xff0c;给企业的数据资产安全带来了严峻挑战。因此&#xf…

202483读书笔记|《把你写进诗歌里》——人生是一场不知何时散场的约会,爱慕向来短暂,失去才是唯一出路

202483读书笔记|《把你写进诗歌里》——人生是一场不知何时散场的约会&#xff0c;爱慕向来短暂&#xff0c;失去才是唯一出路 摘录 《把你写进诗歌里&#xff08;2020年度中国优秀诗歌&#xff09;》&#xff0c;作者上官文露。并不惊艳&#xff0c;中英文双语对照的一本诗集&…

Python | Leetcode Python题解之第168题Excel表列名称

题目&#xff1a; 题解&#xff1a; class Solution:def convertToTitle(self, columnNumber: int) -> str:ans list()while columnNumber > 0:columnNumber - 1ans.append(chr(columnNumber % 26 ord("A")))columnNumber // 26return "".join(an…

新手装修 避坑课2.0:装修之前一定要做好功课(55节课)

课程下载&#xff1a;https://download.csdn.net/download/m0_66047725/89388333 更多资源下载&#xff1a;关注我。 课程目录 第01节1.装修前准备工作.mp4 第02节开篇.mp4 第03节2.装修需要提前定好的设备和材料.mp4 第04节3.自装还是找装修公司.mp4 第05节4.自装怎么找…

win11照片裁剪视频无法保存问题解决

win11照片默认走核显&#xff0c;intel的显卡可能无法解码&#xff0c;在设置里把照片的显示卡默认换成显卡就好了

企业UDP文件传输工具测速的方式(下)

在前一篇文章中&#xff0c;我们深入讨论了UDP传输的基本概念和镭速UDP文件传输工具如何使用命令行快速进行速度测试。现在&#xff0c;让我们进一步探索更为高级和灵活的方法&#xff0c;即通过整合镭速UDP的动态或静态库来实现网络速度的测量&#xff0c;以及如何利用这一过程…

差分数组汇总

本文涉及知识点 算法与数据结构汇总 差分数组 令 a[i] ∑ j : 0 i v D i f f [ i ] \sum_{j:0}^{i}vDiff[i] ∑j:0i​vDiff[i] 如果 vDiff[i1]&#xff0c;则a[i1…]全部 如果vDiff[i2]–,则a[i2…]全部–。 令11 < i2 &#xff0c;则&#xff1a; { a [ i ] 不变&…