ORM框架之NHibernate
什么是NHibernate
NHibernate是一个开源的对象关系映射(ORM)框架,它允许开发人员使用面向对象的方式来访问关系型数据库。它是Hibernate框架的C#版本,Hibernate框架是Java平台上的ORM框架。
使用NHibernate,您可以将.NET对象映射到数据库表,并使用面向对象的方式来查询和操作数据库。NHibernate支持多个数据库,包括Oracle、SQL Server和MySQL等。
要使用NHibernate,您需要做以下几个步骤:
- 安装NHibernate NuGet包。
- 配置NHibernate,包括数据库连接字符串、映射文件等。
- 编写C#类,这些类将映射到数据库表。
- 使用NHibernate的API来查询和操作数据库。
学习NHibernate需要一定的时间和精力,但是一旦您掌握了它,就可以轻松地将.NET应用程序与关系型数据库集成起来。
安装NHibernate
安装NHibernate NuGet包,您需要按照以下步骤操作:
- 打开Visual Studio,创建一个新的C#项目。
- 在“解决方案资源管理器”中,右键单击项目名称,然后选择“管理NuGet程序包”。
- 在“NuGet程序包管理器”中,选择“浏览”选项卡。
- 在搜索框中输入“NHibernate”,然后按Enter键搜索。
- 选择“NHibernate”程序包,然后单击“安装”按钮。
- 等待安装完成后,您就可以开始使用NHibernate了。
配置NHibernate详细步骤
如果您想使用NHibernate框架来访问关系型数据库,那么正确的配置是非常必要的。在本文中,我们将详细介绍如何配置NHibernate框架。
步骤1:添加NHibernate NuGet包
在开始配置NHibernate之前,您需要确保已经安装了NHibernate NuGet包。如果您还没有安装,可以按照以下步骤进行安装:
- 打开Visual Studio,创建一个新的C#项目。
- 在“解决方案资源管理器”中,右键单击项目名称,然后选择“管理NuGet程序包”。
- 在“NuGet程序包管理器”中,选择“浏览”选项卡。
- 在搜索框中输入“NHibernate”,然后按Enter键搜索。
- 选择“NHibernate”程序包,然后单击“安装”按钮。
- 等待安装完成后,您就可以开始使用NHibernate了。
步骤2:配置数据库连接字符串
在使用NHibernate框架之前,您需要配置数据库连接字符串。您可以在app.config或web.config文件中添加以下代码:
<connectionStrings><add name="MyConnectionString" connectionString="Data Source=myServerAddress;Initial Catalog=myDataBase;User Id=myUsername;Password=myPassword;" providerName="System.Data.SqlClient" />
</connectionStrings>
其中,您需要将“myServerAddress”替换为您的服务器地址,“myDataBase”替换为您要连接的数据库名称,“myUsername”和“myPassword”替换为您的数据库用户名和密码。
步骤3:创建映射文件
NHibernate需要一个映射文件将.NET类映射到数据库表。您可以使用XML或Fluent API来创建映射文件。以下是一个使用XML创建映射文件的示例:
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="MyAssembly" namespace="MyNamespace"><class name="MyClass" table="MyTable"><id name="Id" column="Id"><generator class="native" /></id><property name="Name" column="Name" /><property name="Age" column="Age" /></class>
</hibernate-mapping>
其中,“MyAssembly”和“MyNamespace”分别替换为您的程序集和命名空间,“MyClass”和“MyTable”分别替换为您的类和表名。
步骤4:配置NHibernate
在开始使用NHibernate框架之前,您需要在app.config或web.config文件中配置以下代码:
<configSections><section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler,NHibernate" />
</configSections><hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"><session-factory><property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property><property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property><property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property><property name="connection.connection_string_name">MyConnectionString</property><mapping assembly="MyAssembly" /></session-factory>
</hibernate-configuration>
其中,“MyConnectionString”替换为您在步骤2中定义的连接字符串,“MyAssembly”替换为您的程序集名称。
如何编写C#类映射到数据库表
当我们使用NHibernate框架时,我们需要将.NET对象映射到数据库表。这可以通过使用映射文件或Fluent API来完成。
使用XML创建映射文件
XML文件是映射文件的传统格式。以下是一个使用XML创建映射文件的示例:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"assembly="MyAssembly"namespace="MyNamespace"><class name="MyClass" table="MyTable"><id name="Id" column="Id"><generator class="native" /></id><property name="Name" column="Name" /><property name="Age" column="Age" /></class>
</hibernate-mapping>
其中,MyAssembly
和MyNamespace
分别替换为您的程序集和命名空间,MyClass
和MyTable
分别替换为您的类和表名。在上面的示例中,Id
是主键,Name
和Age
是属性。
使用Fluent API创建映射文件
Fluent API是一种更简洁的方式来编写映射文件。以下是一个使用Fluent API创建映射文件的示例:
public class MyClassMap : ClassMap<MyClass>
{public MyClassMap(){Table("MyTable");Id(x => x.Id);Map(x => x.Name);Map(x => x.Age);}
}
在上面的示例中,我们使用ClassMap
类来定义映射文件。Table
方法指定表名,Id
和Map
方法分别指定主键和属性。
如何使用NHibernate的API来查询和操作数据库
使用ISession接口
ISession接口是NHibernate中最重要的接口之一。它代表着一个与数据库的会话,可以用来执行各种数据库操作。以下是一些常见的操作:
插入数据
要向数据库中插入数据,您可以创建一个实体对象,然后使用ISession接口的Save方法将其保存到数据库中。例如:
MyClass obj = new MyClass();
obj.Name = "John";
obj.Age = 30;using (ISession session = sessionFactory.OpenSession())
{using (ITransaction transaction = session.BeginTransaction()){session.Save(obj);transaction.Commit();}
}
在上面的示例中,我们创建了一个MyClass
对象,并将其保存到数据库中。使用using
语句块可以确保ISession和ITransaction对象在使用后被正确地关闭和释放。
更新数据
要更新数据库中的数据,您可以查询要更新的实体对象,然后修改其属性并将其保存回数据库。例如:
using (ISession session = sessionFactory.OpenSession())
{using (ITransaction transaction = session.BeginTransaction()){MyClass obj = session.Get<MyClass>(1);obj.Name = "Tom";obj.Age = 35;session.SaveOrUpdate(obj);transaction.Commit();}
}
在上面的示例中,我们查询了一个id为1的MyClass
对象,并将其属性修改为Tom
和35。然后,我们将其保存回数据库中,使用SaveOrUpdate方法可以自动判断是插入还是更新数据。
删除数据
要从数据库中删除数据,您可以查询要删除的实体对象,然后使用ISession接口的Delete方法将其从数据库中删除。例如:
using (ISession session = sessionFactory.OpenSession())
{using (ITransaction transaction = session.BeginTransaction()){MyClass obj = session.Get<MyClass>(1);session.Delete(obj);transaction.Commit();}
}
在上面的示例中,我们查询了一个id为1的MyClass
对象,并将其从数据库中删除。
查询数据
要从数据库中查询数据,您可以使用ISession接口的CreateQuery方法创建一个查询对象,然后使用该对象进行查询。例如:
using (ISession session = sessionFactory.OpenSession())
{using (ITransaction transaction = session.BeginTransaction()){IQuery query = session.CreateQuery("from MyClass where Age > :age");query.SetInt32("age", 30);IList<MyClass> list = query.List<MyClass>();foreach (MyClass obj in list){Console.WriteLine("Name: " + obj.Name + ", Age: " + obj.Age);}transaction.Commit();}
}
在上面的示例中,我们创建了一个查询对象,查询年龄大于30的所有MyClass
对象,并将其打印出来。
总结
使用NHibernate的API来查询和操作数据库非常简单。ISession接口提供了各种方法来执行各种数据库操作,包括插入、更新、删除和查询数据。使用NHibernate的API,您可以轻松地将.NET应用程序与关系型数据库集成起来。
相关文章:
ORM框架之NHibernate
什么是NHibernate NHibernate是一个开源的对象关系映射(ORM)框架,它允许开发人员使用面向对象的方式来访问关系型数据库。它是Hibernate框架的C#版本,Hibernate框架是Java平台上的ORM框架。 使用NHibernate,您可以将…...
凑微分练习
前言 在学习第一类换元法(凑微分法)时,我们常常需要凑微分。为了更加熟练地运用凑微分法,下面有几道凑微分例题供大家练习。 记住df(x)f′(x)dxdf(x)f(x)dxdf(x)f′(x)dx 例题1 dx‾d(ax)dx\underline{\quad}d(ax)dxd(ax)dx‾…...

JavaWeb——多线程使用哈希表
目录 一、HashMap 1、定义 二、HashTable 1、定义: 2、区别: 三、ConcurrentHashMap 1、定义: 2、优化 (1)、加锁粒度不同——触发锁冲突的频率不同 (2)、充分利用CAS机制——无锁编程…...
anaconda permission denied
可能是路径不对 我的是只写了dir,没写文件名,而我要的是某个文件的路径,所以就报这个错。 具体,我需要某个权重的路径,比如pytorch_resnet50.pth,但我只写了这个权重所在的dir,比如F:/software/…...

蓝桥杯带刷,带刷!!!
A:::::::::::::::::::::::::::::::::::m计划(双指针,滑动窗口,倍增) 题目描述 小明是个鹅卵石收藏者,从小到大他一共收藏了 nn 块鹅卵石,编号分别为 1∼n,价值分别为 a1,a2&…...

第03讲:MinIO分布式文件服务器
一、什么是MinIO Minio 是个基于 Golang 编写的开源对象存储套件,虽然轻量,却拥有着不错的性能。 官网地址:MinIO | High Performance, Kubernetes Native Object Storageopen in new window官网文档地址:MinIO | The MinIO Qui…...
WireShark
wireshark 常用命令: frame.len 帧数据总长度:包含MAC头IP头UDP头UDP数据 eg: 1、 重传命令的长度是62, Frame.len 62 2、 长度大于200的包,frame.len > 200 3、 长度小于80的包,frame.len < 80 Ip.src 数据包的发送源IP地…...
Thinkphp 6.0多语言
本节课我们来学习一下如何配置的多语言功能,并实现调用方法。 一.多语言 1. 如果要开启多语言切换功能,中间件定义文件 middleware.php 开启; // 多语言加载 \think\middleware\LoadLangPack::class, 2. 配置文件在 config/lang…...

生成式AI已形成全球性“AI再造业务”趋势
3月28日至31日,博鳌亚洲论坛2023年年会在海南举行。实体经济与数字经济如何融合发展,产业数字化如何加速向深层次拓展,生成式AI会给产业经济带来哪些变革?这些话题成为今年论坛热点。 百度集团执行副总裁、百度智能云事业群总裁沈…...

kubesphere 安装 skywalking
kubesphere 安装 skywalking 前言 在测试ELK过程中,框架内部使用skywalking来插入的traceId,没有服务端导致Ignored_Trace,先安装下试试skywalking使用效果,后面考了替换为Tlog 先来安装skywalking… 1. 导入helm原 地址&#x…...

乐鑫 × 全国大学生物联网设计竞赛|探究基于 ESP32-S3 的农业革新应用
2023 年全国大学生物联网设计竞赛(下简称“竞赛”)现已官宣启幕!乐鑫科技 (688018.SH) 作为竞赛金牌合作伙伴,将为同学们带来基于 AI SoC ESP32-S3 的独立竞赛任务,并全程提供软硬件开发资源、技术培训…...

【技术分享】华为防火墙多出口接入到Internet
组网需求 如图1所示,FW作为安全网关部署在网络出口,企业分别从ISP1和ISP2租用一条链路。 企业希望访问Server 1的报文从ISP1链路转发,访问Server 2的报文从ISP2链路转发。 当其中一条链路故障时,后续流量可以通过另一条链路转发…...

Winnolin绘制药时曲线图C-T
文章目录前言一、各受试者C-T图1.导入数据2.设置-运行2.查看结果,修改参数二、各制剂C-T图1.导入数据2.设置-运行2.查看结果,修改参数三、平均C-T图1.计算统计量2.设置统计量计算参数(Set Up)3.绘图XY Plot4.查看结果,…...
Kafka系列——详解如何使用和配置生产者实现可靠的消息发送
在可靠的系统里使用生产者 即使我们尽可能把 broker 配置得很可靠,但如果没有对生产者进行可靠性方面的配置,整个系统仍然有可能出现突发性的数据丢失。 比如下面的两个例子: (一)为 broker 配置了 3 个副本࿰…...

wordpres漏洞扫描器——wpscan
WordPress 使用PHP语言开发的博客平台 WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站。也可以把 WordPress当作一个内容管理系统(CMS)来使用。 WordPress是一款个人博客系统,…...

代码随想录_二叉树_leetcode112、113
leetcode112 路径总和 112. 路径总和 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返…...
mongo-db相关方法
一、参数 名称描述db.adminCommand()针对admin数据库运行命令。db.aggregate()运行不需要基础集合的管理/诊断管道。db.cloneDatabase(hostname)不推荐使用。当针对MongoDB 4.0或更早版本运行时,将数据库从远程主机复制到当前主机。针对MongoDB 4.2或更高版本运行时…...

《Vue3实战》 第二章 创建项目和目录结构
1、创建项目 1.1、命令格式:vue create 项目名称 vue create vue3_example0011.2、运行项目 npm run serve1.2.1、增加run命令 启动时想修改命令,例如: npm run dev1、找到项目根路径下的package.json文件; 2、找到【scripts…...

13433元!上海一季度平均薪酬出炉!你拖后腿了吗?(附招聘岗位)
2023年第一季度智联招聘, 发布《中国企业招聘薪酬报告》, 显示上海平均招聘薪酬为 13433元/月!!! 13433元/月!!! 13433元/月!!! ☟ ☟ ☟ 同…...
leetcode剑指 Offer 16. 数值的整数次方
题目描述解题思路执行结果leetcode .题目描述 实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。 示例 1: 输入:x 2.00000, n 10 输出:1…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...

《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...