.NET Core 中的 ORM 框架对比

        在 .NET Core 中选择正确的对象关系映射 (ORM) 工具可能是开发生命周期中的关键决策。所选的 ORM 会影响应用程序的性能、可维护性和可伸缩性。在本文中,我们将深入分析三个突出的 ORM 选择:Entity Framework Core、Dapper 和 NHibernate。

        每个 ORM 都有其优点和缺点,我们将通过实际的代码示例来探索它们。1. 实体框架核心实体框架核心(EF Core)是Microsoft的官方ORM,以其简单性和与其他Microsoft技术的集成而闻名。它支持各种数据库提供程序,并遵循约定优先于配置的方法。让我们深入研究一个详细的例子:模型定义public

        在 .NET Core 中选择正确的对象关系映射 (ORM) 工具可能是开发生命周期中的关键决策。所选的 ORM 会影响应用程序的性能、可维护性和可伸缩性。在本文中,我们将深入分析三个突出的 ORM 选择:Entity Framework Core、Dapper 和 NHibernate。每个 ORM 都有其优点和缺点,我们将通过实际的代码示例来探索它们。

1. EF Core

Entity Framework (EF) Core 是轻量化、可扩展、开源和跨平台版的常用 Entity Framework 数据访问技术。

EF Core 可用作对象关系映射程序 (O/RM),这可以实现以下两点:

  • 使 .NET 开发人员能够使用 .NET 对象处理数据库。
  • 无需再像通常那样编写大部分数据访问代码。
  • EF查询使用的是LINQ进行查询

让我们深入研究一个详细的例子:

模型定义

public class Blog
{public int BlogId { get; set; }public string Url { get; set; }public int Rating { get; set; }public List<Post> Posts { get; set; }
}public class Post
{public int PostId { get; set; }public string Title { get; set; }public string Content { get; set; }public int BlogId { get; set; }public Blog Blog { get; set; }
}

数据库上下文

public class BloggingContext : DbContext
{public DbSet<Blog> Blogs { get; set; }public DbSet<Post> Posts { get; set; }protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True");}
}

查询数据

using (var db = new BloggingContext())
{var blogs = db.Blogs.Where(b => b.Rating > 3).OrderBy(b => b.Url).ToList();
}

保存数据

using (var db = new BloggingContext())
{var blog = new Blog { Url = "http://sample.com" };db.Blogs.Add(blog);db.SaveChanges();
}

EF O/RM 注意事项

虽然 EF Core 善长提取许多编程详细信息,但还是有一些适用于任何 O/RM 的最佳做法,可帮助避免生产应用中的常见陷阱:

  • 若要在高性能生产应用中构建、调试、分析和迁移数据,必须具备基础数据库服务器的中级知识或更高级别的知识。 例如,有关主键和外键、约束、索引、标准化、DML 和 DDL 语句、数据类型、分析等方面的知识。
  • 功能和集成测试:请务必尽可能严密地复制生产环境,以便:
    • 查找仅在使用特定版本的数据库服务器时应用才出现的问题。
    • 在升级 EF Core 和其他依赖项时捕获中断性变更。 例如,添加或升级 ASP.NET Core、OData 或 AutoMapper 等框架。 这些依赖项可能以多种意外方式影响 EF Core。
  • 通过代表性负载进行性能和压力测试。 某些功能的不成熟用法缩放性不佳。 例如,多项集合包含内容、大量使用延迟加载、对未编制索引的列执行条件查询、对存储生成的值进行大规模更新和插入、缺乏并发处理、大型模型、缓存策略不充分。
  • 安全评审:例如,连接字符串和其他机密处理、非部署操作的数据库权限、原始 SQL 的输入验证、敏感数据加密。
  • 确保日志记录和诊断充足且可用。 例如,适当的日志记录配置、查询标记和 Application Insights。
  • 错误恢复。 为常见故障场景(如版本回退、回退服务器、横向扩展和负载平衡、DoS 缓解和数据备份)准备应急计划。
  • 应用程序部署和迁移。 规划如何在部署过程中应用迁移;在应用程序启动时执行此操作可能会导致并发问题,并且对于常规操作,这所需的权限比必要权限更高。 在迁移期间,使用暂存来辅助从错误中恢复。 有关详细信息,请参阅应用迁移。
  • 生成的迁移的详细检查和测试。 将迁移应用于生产数据前,应对其进行全面测试。 若表中包含生产数据,架构的形状和列类型就不能轻易更改。 例如,在 SQL Server 上,对于映射到字符串和十进制属性的列,nvarchar(max) 和 decimal(18, 2) 极少成为最佳类型,但这些是 EF 使用的默认值,因为 EF 不了解你的具体情况。

2.Dapper

        Dapper 主要能够让你练习你的 SQL 技能,按你认为的那样构建查询和命令。它接近于“金属”而非标准的 ORM,免除了解释查询的工作。Dapper 可以通过其 API 为你执行查询以及—假如查询结果的架构与目标类型的属性相匹配—自动实例化对象并向对象填充查询结果。此处还有另一个显著的性能优势: Dapper 能够有效缓存它获悉的映射,从而实现后续查询的极速反序列化。

DapperDesigner 类

public class DapperDesigner
{public DapperDesigner() {Products = new List<Product>();Clients = new List<Client>();}public int Id { get; set; }public string LabelName { get; set; }public string Founder { get; set; }public Dapperness Dapperness { get; set; }public List<Client> Clients { get; set; }public List<Product> Products { get; set; }public ContactInfo ContactInfo { get; set; }
}

查询代码类 

var designers = sqlConn.Query<DapperDesigner>("select * from DapperDesigners"); 

Dapper 和关系查询 

var sql = @"select * from DapperDesigners D            JOIN Products P            ON P.DapperDesignerId = D.Id"; var designers= conn.Query<DapperDesigner, Product,DapperDesigner> (sql,(designer, product) => { designer.Products.Add(product);                               return designer; });

编码难度加大,执行速度变快 

Dapper 是精确控制 SQL 查询和高性能数据访问至关重要的场景的绝佳选择。它对于读取密集型应用程序特别有用。

Dapper使用查询用的是原始的SQL。

3. NHibernate

NHibernate是Hibernate的C#版,众所周知Hibernate是Java 里ORM的顶梁柱。与EntityFramework不同的地方是,Hibernate以配置文件为主,通过配置文件规范使用,Object/Relation 映射。而NHibernate这继承了这一点,也是以配置文件优先

映射

需要创建一个项目用的配置文件:App.config.C# 项目中,除了Web类型的项目,每个项目的主配置文件的名称都是App.config,这是一个固定名称。文件内容如下:<?xml version="1.0" encoding="utf-8" ?>
<configuration>
</configuration>
在 configuration节点之间添加以下内容:<configSections><section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate"/></configSections>
这段代码的含义是,在config文件中添加一个 hibernate-configuration结点,结点的解析由类:NHibernate.Cfg.ConfigurationSectionHandler,所在包是NHibernate。在App.config文件configuration结点中添加以下代码:<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"><session-factory><property name="dialect">NHibernate.Dialect.MsSql2012Dialect</property><property name="connection.connection_string">Data Source=.;Initial Catalog=Demo;Integrated Security=True</property><property name="hbm2ddl.auto">create-drop</property><mapping assembly="dataprovider" /></session-factory>
</hibernate-configuration>
这是固定格式,其中dialect表示使用的数据库类型,connection.connection_string 表示连接字符串。mapping表示映射关系文件所在项目。

获取ISessionFactory

然后获取一个ISessionFactory:Configuration cfg = new Configuration();
var sessionFactory = cfg.BuildSessionFactory();
当然,如果直接运行代码的话,会在 BuildSessionFactory这里报错。因为没有为SQL Server安装数据访问驱动:System.Data.SqlClient
将数据访问驱动安装成功后,运行可以获得sessionFactory。sessionFactory用来创建一个访问数据库的Session

 增删改查

先来个简单的示例类:public class Cat
{public virtual string Id { get; set; }public virtual string Name { get; set; }public virtual char Sex { get; set; }public virtual float Weight { get; set; }
}
NHibernate的映射关系文件:Cat.hbm.xml<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="dataprovider" assembly="dataprovider"><class name="Cat" table="Cat"><!-- A 32 hex character is our surrogate key. It's automaticallygenerated by NHibernate with the UUID pattern. --><id name="Id"><column name="CatId" sql-type="char(32)" not-null="true"/><generator class="uuid.hex" /></id><!-- A cat has to have a name, but it shouldn't be too long. --><property name="Name"><column name="Name" length="16" not-null="true" /></property><property name="Sex" /><property name="Weight" /></class>
</hibernate-mapping>
创建完成后,右键选中文件,修改文件生成操作为嵌套的资源然后编写实例代码:Configuration cfg = new Configuration().Configure();using (var sessionFactory = cfg.BuildSessionFactory())
using (var session = sessionFactory.OpenSession())
{
// 通过session操作session.Close();
}
新增一个Cat:var princess = new Cat
{Name = "Princess",Sex = 'F',Weight = 7.4f
};
session.Save(princess);
session.Flush();//推送修改给数据库,不调用的话数据库里将没有数据
查询并修改:var cats = session.Query<Cat>().ToList();
var cat = cats.First();
cat.Name = "xiao li";
session.Update(cat);
session.Flush();
查询并删除:var cats = session.Query<Cat>().ToList();
var cat = cats.First();
session.Delete(cat);
session.Flush();

结论

        在 .NET Core 中选择 ORM 涉及评估项目的特定需求和权衡。Entity Framework Core 在简单性和基于约定的开发方面表现出色,Dapper 最适合对性能敏感的方案,而 NHibernate 为复杂的应用程序提供了广泛的功能。根据项目的要求做出明智的决策,你将在 .NET Core 应用程序中实现高效且可维护的数据库交互。

注意:

        三种ORM映射虽然采取的映射方式不同,但是在数据操作中都有一个共同的特征就是建立上下文数据库对象或者缓存工厂,以此来简化数据操作的。

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

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

相关文章

算法设计与优化——向量中数据唯一化

0.概述 很多应用中&#xff0c;在进一步处理之前都要求数据元素互异。以网络搜索引擎为例&#xff0c;多个计算节点各自获得的局部搜索结果&#xff0c;需首先剔除其中重复的项目&#xff0c;方可合并为一份完整的报告。类似地&#xff0c;所谓向量的唯一化处理&#xff0c;就…

liqo学习及安装,k8s,kubernetes多集群互联

先按照官方的教程在虚拟机安装学习 在开始以下教程之前&#xff0c;您应该确保您的系统上安装了以下软件&#xff1a; Docker&#xff0c;容器运行时。Kubectl&#xff0c;Kubernetes 的命令行工具。 curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.…

本地有一个face.txt文档,里面是50条url图片链接。怎么通过python做数据增强,还额外再生成200张!!!???

为了完成这个作业&#xff0c;我们需要编写一个Python脚本&#xff0c;该脚本将读取face.txt文件中的图片链接&#xff0c;并对这些链接进行处理&#xff0c;生成额外的图片链接作为数据增强。请注意&#xff0c;由于我们实际上没有真正的图像数据&#xff0c;而是只有URL链接&…

python笔记-检测时间数据递增正确性

概述 本文主要描述了使用一个python脚本检查输入的时间数据&#xff0c;是否按正常递增的格式增加。 背景 在平常写时间校准算法的过程中&#xff0c;输出的数据不好检查是否每个时刻数据都是正确的&#xff0c;所以需要写一个脚本来检查&#xff0c;时间校准算法输出的时间…

基于Python利用zhconv模块进行简繁体字转换

在处理中文文本时&#xff0c;简繁体字之间的转换是一项常见的任务。Python提供了许多库来实现这个目的&#xff0c;其中之一就是zhconv。zhconv是一个Python库&#xff0c;提供了简体字和繁体字之间的转换功能。本教程将向你展示如何使用zhconv模块来实现简繁体字的互转&#…

Redis底层数据结构之Dict

目录 一、概述二、Dict结构三、Dictht结构四、DictEntry结构五、核心特性 上一篇文章 reids底层数据结构之quicklist 一、概述 Redis 的 Dict 是一个高效的键值对映射数据结构&#xff0c;采用双哈希表实现以支持无锁的渐进式 Rehash&#xff0c;确保扩容或缩容时的高效性能。…

想冲宇宙厂,直接挂了。。。

宇宙厂实际是字节&#xff0c;这个称呼是因为字节跳动主宰了宇宙内一切App&#xff0c;有点家大业大的意思。 今天分享一位字节春招凉经&#xff0c;问了一些数据库和Java八股&#xff0c;没出算法题&#xff0c;直接挂了&#xff0c;竟然最喜欢出算法题的字节&#xff0c;这次…

深入探索Android Service:后台服务的终极指南(中)

引言 在深入探索了Service的基本概念和生命周期管理后&#xff0c;本文将聚焦于Android Service的进阶应用&#xff0c;包括前台服务的运用、Android 5.0以上版本中隐式启动Service的问题、确保Service稳定性的策略&#xff0c;以及Service在进程间通信和复杂后台任务处理中的高…

iptables实现docker容器动态端口映射实操

背景 之前在《Docker 动态修改容器端口映射的方法》一文中&#xff0c;说明了如何使用修改配置和加防火墙规则实现动态端口映射。但是没有具体分享加防火墙实现动态端口映射的实际案例。今天就分享一下实际操作案例&#xff0c;供大家参考。 分析 动态端口映射的用途 容器端口…

(2024)Visual Studio的介绍、安装与使用

Visual Studio介绍 1.Visual Studio是什么&#xff1f; Visual Studio是微软公司推出的一款开发工具包系列产品&#xff0c;它是一个基本完整的开发工具集&#xff0c;为软件开发者提供了整个软件生命周期中所需的大部分工具。 2.Visual Studio的定义 Visual Studio是美国微软公…

初级银行从业资格证知识点(一)

从支持角度来看&#xff0c;GDP由 消费、投资和净出口三大部分构成。 宏观经济发展的 总体目标&#xff1a; 经济增长、充分就业、物价稳定、国际收支平衡。 国际货币基金组织将金融危机分为&#xff1a; 货币危机、银行危机、外债危机、系统性金融危机。随着经济全球化及金融创…

网盘_游戏_博客自动化部署(Nginx多项目部署)

目录 一.前提介绍 二.环境介绍 三.自述&#xff08;脚本&#xff09; 四.关于Nginx多项目部署 一.前提介绍 在我之前的博客里详细介绍了上述项目的部署&#xff0c;那么如何使用简单脚本自动部署和使用Nginx多项目部署是本文来介绍的基础篇章。 二.环境介绍 CentOS Linux…

fawawf

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

【Linux】文件目录及路径表示

1. Linux目录结构 在 Linux 系统中&#xff0c;有几个目录是比较重要的&#xff0c;平时需要注意不要误删除或者随意更改内部文件。 /etc&#xff1a; 这个是系统中的配置文件&#xff0c;如果更改了该目录下的某个文件可能会导致系统不能启动。 /bin, /sbin, /usr/bin, /usr…

java泛型介绍

Java 泛型是 JDK 5 引入的一个特性&#xff0c;它允许我们在定义类、接口和方法时使用类型参数&#xff0c;从而使代码更加灵活和类型安全。泛型的主要目的是在编译期提供类型参数&#xff0c;让程序员能够在编译期间就捕获类型错误&#xff0c;而不是在运行时才发现。这样做提…

小程序AI智能名片S2B2C商城系统:解锁内容深耕新境界,助力品牌企业高效定制内容策略

在数字化时代&#xff0c;内容营销已成为品牌企业获取市场份额、增强用户黏性的关键武器。然而&#xff0c;面对海量的互联网信息和复杂多样的社交媒体平台&#xff0c;如何有效地深耕内容&#xff0c;成为众多品牌企业面临的难题。 传统的内容分类与识别方式&#xff0c;往往依…

【数据分析面试】28. 20个Python问答题 (入门级考察:基础操作、数据处理与分析统计)

今天的20个问题考察了 Python 的基础能力&#xff0c;包括数据结构、基本操作、数据处理、数据分析和统计等方面。无论是从事数据分析、机器学习还是其他数据相关工作&#xff0c;这些都是必不可少的基础技能。 数据结构与基础操作&#xff1a; 什么是 Pandas 库&#xff1f;它…

中兴5G随身wifi怎么样?中兴5G随身wifiVS格行5G随身wifi对比测评!公认最好的随身WiFi的格行随身WiFi真实测评!随身WiFi哪个品牌好?

随着各大品牌5G随身wifi的横空出世&#xff0c;其中中兴和格行5G随身wifi的呼声越来越高&#xff0c;那么性能上谁更胜一筹&#xff1f;套餐费用谁更亲民&#xff1f;售后保障谁更到位&#xff1f;今天就来一个全方位测评对比&#xff01; 一&#xff0c;首先是设备的整体外观&…

uniapp:小白1分钟学会使用webSocket(可无脑复制)

uni.connectSocket() uni.$emit页面通信 项目中使用uni.connectSocket()创建webSocket的总结&#xff0c;代码可无脑复制&#xff0c;直接使用。 1、main.js 引入vuex import store from ./store; Vue.prototype.$store store;vuex中封装webSocket 2、vuex的&#xff1a;index…

python队列

1.三种实现 列表&#xff1a;list队列&#xff1a;Queue双端队列&#xff1a;deque 性能&#xff1a;从上往下依次变好&#xff0c;其中deque比Queue快10倍以上 1.1 list模拟队列 length 10 q []# 入队 for i in range(length):q.append(i) print(q) print(len(q))# 出队…