NHibernate也是能够操作存储过程的,不过第一次配置可能会碰到很多错误。

一、删除

  首先,我们新建一个存储过程如下:

  CREATE PROC DeletePerson
  @Id int
  AS
  DELETE FROM Person WHERE PersonId = @Id;

  修改映射文件,添加删除对象的存储过程:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="Model.PersonModel, Model" table="Person">
<id name="PersonId" column="PersonId" type="Int32">
<generator class="native"/>
</id>
<property name="PersonName" column="PersonName" type="String"/>
<!--多对一关系:Person属于一个Country name是Person实体类里的-->
<many-to-one name="Country" column="CountryId" not-null="true" class="Model.CountryModel,Model" foreign-key="FK_Person_Country" />
<!-- 一个Country里面有多个Person -->
<set name="ListChild" table="Child" generic="true">
<key column="ParentId" foreign-key="FK_Child_Person"/>
<one-to-many class="Model.ChildModel,Model"/>
</set>
<sql-delete>DeletePerson ?</sql-delete>
</class>
</hibernate-mapping>

  执行存代码:

            using (ISession session = sessionFactory.OpenSession())
{
PersonModel p = session.Get<PersonModel>(4);
session.Delete(p);
session.Flush();
}

  从监控到,SQLServer执行的语句如下:

exec sp_executesql N'DeletePerson @p0',N'@p0 int',@p0=5

  明显已经看到哥写的存储过程名字。如果不是执行存储过程,则执行的语句如下:

exec sp_executesql N'DELETE FROM Person WHERE PersonId = @p0',N'@p0 int',@p0=5

  可以看到,如果你配置了存储过程,那么Delete()方法就执行存储过程,否则就执行NHibernate自己生成的SQL语句。

二、添加

   测试了一个NHibernate的添加存储过程之后,感觉就一个字,不爽,估计这种方式配置的存储也不会是好的选择,还是生成语句比较好。

  存储过程如下:

ALTER PROC InsertCountry
@CountryName nvarchar(50),
@CountryId int OUTPUT
AS
INSERT INTO Country VALUES(@CountryName);

  首先,添加将CountryId设置为自增的。

  然后配置文件如下(注意两个加粗的地方):

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="Model.CountryModel,Model" table="Country">
<id name="CountryId" column="CountryId" type="Int32">
<generator class="increment"/>
</id>
<property name="CountryName" column="CountryName" type="String"/>
<!-- 一个Country里面有多个Person -->
<set name="ListPerson" table="Person" generic="true">
<key column="CountryId" foreign-key="FK_Person_Country"/>
<one-to-many class="Model.PersonModel,Model"/>
</set>
<sql-insert>InsertCountry ?,?</sql-insert>
</class>
</hibernate-mapping>

  设置increment的目的是主键,本处为CountryId由NHibernate生成。实际上不是一个什么好的方法,因为NHibernate是通过SQL语句:

SELECT MAX(CountryId) FROM Country

  获得的。并且,你还必须设置数据库主键自增。一句话,不爽。都说了没什么人会选择这种方式咯。

  执行代码如下:

        static void Main(string[] args)
{
ISessionFactory sessionFactory = new Configuration().Configure().BuildSessionFactory(); using (ISession session = sessionFactory.OpenSession())
{
CountryModel c = new CountryModel();
c.CountryName = "青州";
session.Save(c);
session.Flush();
}
Console.ReadKey();
}

  监控到SQL Server执行了:

exec sp_executesql N'InsertCountry @p0,@p1',N'@p0 nvarchar(4000),@p1 int',@p0=N'青州',@p1=8

三、更新

  更新的方式与Insert类似,不过好点过Insert了,还不错。

  存储过程:

CREATE PROC UpdateCountry
@CountryName nvarchar(50),
@CountryId int OUTPUT
AS
UPDATE Country SET CountryName = @CountryName WHERE CountryId = @CountryId;

  映射文件:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="Model.CountryModel,Model" table="Country">
<id name="CountryId" column="CountryId" type="Int32">
<generator class="increment"/>
</id>
<property name="CountryName" column="CountryName" type="String"/>
<!-- 一个Country里面有多个Person -->
<set name="ListPerson" table="Person" generic="true">
<key column="CountryId" foreign-key="FK_Person_Country"/>
<one-to-many class="Model.PersonModel,Model"/>
</set>
<sql-insert>InsertCountry ?,?</sql-insert>
<sql-update>UpdateCountry ?,?</sql-update>
</class>
</hibernate-mapping>

  执行代码如下:

        static void Main(string[] args)
{
ISessionFactory sessionFactory = new Configuration().Configure().BuildSessionFactory(); using (ISession session = sessionFactory.OpenSession())
{
CountryModel c = session.Get<CountryModel>(4);
c.CountryName = "修改测试";
session.Update(c);
session.Flush();
} Console.ReadKey();
}

  监控到SQL执行的语句如下:

exec sp_executesql N'UpdateCountry @p0,@p1',N'@p0 nvarchar(4000),@p1 int',@p0=N'修改测试',@p1=4

四、查询

  首先,创建一个存储过程如下:

CREATE PROC EntityCountry
@CountryId int
AS
SELECT * FROM Country WHERE CountryId =@CountryId

  在NHibernate中,通过命名查询来映射存储过程,使用return返回具体的实体类,使用<return-property>告诉NHibernate使用哪些属性值,允许我们来选择如何引用字段以及属性。

  映射文件如下:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="Model.CountryModel,Model" table="Country">
<id name="CountryId" column="CountryId" type="Int32">
<generator class="increment"/>
</id>
<property name="CountryName" column="CountryName" type="String"/>
<!-- 一个Country里面有多个Person -->
<set name="ListPerson" table="Person" generic="true">
<key column="CountryId" foreign-key="FK_Person_Country"/>
<one-to-many class="Model.PersonModel,Model"/>
</set>
</class>
<sql-query name="Cc">
<return class="Model.CountryModel,Model" />
EXEC EntityCountry :CountryId
</sql-query>

</hibernate-mapping>

  执行操作:

        static void Main(string[] args)
{
ISessionFactory sessionFactory = new Configuration().Configure().BuildSessionFactory(); using (ISession session = sessionFactory.OpenSession())
{
CountryModel c = session.GetNamedQuery("Cc").SetInt32("CountryId", 1).UniqueResult<CountryModel>();
Console.WriteLine(c.CountryName);
} Console.ReadKey();
}

  监控到SQL Server执行的语句如下:

exec sp_executesql N'EXEC EntityCountry @p0',N'@p0 int',@p0=1

  考虑到在NHibernate中使用存储过程并不是一个很好的选择,也无谓学习得太深入了,这个真心不想用。

五、总结

  <sql-query>配置在<class>后面。

  其他增删改要遵循以下顺序:

  •   <sql-insert>
  •   <sql-update>
  •   <sql-delete>

  OK,NHibernate执行存储过程就这么多了,以后用到的时候,再更新。

转自:http://www.cnblogs.com/kissdodog/archive/2013/09/21/3330930.html

NHibernate 存储过程使用的更多相关文章

  1. [NHibernate]存储过程的使用(二)

    目录 写在前面 文档与系列文章 创建对象 更新对象 总结 写在前面 上篇文章介绍了如何使用MyGeneration代码生成器生成存储过程,以及nhibernate中通过存储过程删除数据的内容,这篇文章 ...

  2. [NHibernate]存储过程的使用(三)

    目录 写在前面 文档与系列文章 查询 总结 写在前面 前面的文章介绍了在nhibernate中使用存储过程进行增删改的操作,当然查询也是可以的,在nhibernate中也可以执行任意的存储过程.本篇文 ...

  3. [NHibernate]存储过程的使用(一)

    目录 写在前面 文档与系列文章 Nhibernate中使用存储过程 一个例子 总结 写在前面 上篇文章一个小插曲,分析了延迟加载是如何解决N+1 select查询问题的.这篇开始介绍在nhiberna ...

  4. Nhibernate 存储过程获取返回值

    写在前面:因为项目使用ssh.net所以做着做着要调用存储过程,而且是有返回值的,按照以前的做法直接在参数里指定下就可以获取,但是在nhibernate里调用就有点陌生了,百度一下得出的结果有两种:第 ...

  5. NHibernate 存储过程 第十四篇

    NHibernate也是能够操作存储过程的,不过第一次配置可能会碰到很多错误. 一.删除 首先,我们新建一个存储过程如下: CREATE PROC DeletePerson @Id int AS DE ...

  6. 转:NHibernate 存储过程

    http://stackoverflow.com/questions/928847/how-to-get-the-return-value-from-a-sql-server-stored-proce ...

  7. [Nhibernate]SchemaExport工具的使用(二)——创建表及其约束、存储过程、视图

    目录 写在前面 文档与系列文章 表及其约束 存储过程 视图 总结 写在前面 由于一直在山西出差,有几天没更新博客了.昨晚回到家,将博客园最近三天更新的文章搜集了一下,花费了半天的时间,看了看,有些文章 ...

  8. 耗时两月,NHibernate系列出炉

    写在前面 这篇总结本来是昨天要写的,可昨天大学班长来视察工作,多喝了点,回来就倒头就睡了,也就把这篇总结的文章拖到了今天. nhibernate系列从开始着手写,到现在前后耗费大概两个月的时间,通过总 ...

  9. [NHibernate]代码生成器的使用

    目录 写在前面 文档与系列文章 代码生成器的使用 总结 写在前面 前面的文章介绍了nhibernate的相关知识,都是自己手敲的代码,有时候显得特别的麻烦,比如你必须编写持久化类,映射文件等等,举得例 ...

随机推荐

  1. 覆盖(override)和重载(overload)

    覆盖(override)重写和 重载(overload) 继承,重写--->多态   我懂了,你懂吗 ,不看看文章 java 子类重写父类的方法应注意的问题 Java多态性理解

  2. [FTP] FTPHelper-FTP帮助类,常用操作方法 (转载)

    点击下载 FTPHelper.zip 这个类是FTP服务器的一些操作1.连接FTP服务器 2.上传3.下载4.删除文件5.获取当前目录下明细(包含文件和文件夹)  6.获取FTP文件列表(包括文件夹) ...

  3. C#调用cmd程序,读取结果

    示例,调用cmd执行PING命令,读取结果,代码如下: using System; using System.Collections.Generic; using System.Linq; using ...

  4. C#自定义线程池

    自定义线程池-c#的简单实现 下面是代码,希望大家提出更好的建议: 1.ThreadManager.cs using System; using System.Threading; using Sys ...

  5. c#数组的交集,差集,并集

    , , , , }; , , , , }; // 差集 var z1 = x.Except(y); foreach (var i in z1) { Console.Write(i + " & ...

  6. Codevs 1081 线段树练习 2

    1081 线段树练习 2 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 传送门 题目描述 Description 给你N个数,有两种操作 1:给区间[a,b]的 ...

  7. PHP设计模式之:工厂模式

    工厂模式: 由工厂类根据参数来决定创建出哪一种产品类的实例: 工厂类是指包含了一个专门用来创建其他对象的方法的类.所谓按需分配,传入参数进行选择,返回具体的类.工厂模式的最主要作用就是对象创建的封装. ...

  8. linux 的一个防火墙策略

    #警告:在运行脚本后,勿必单独运行 iptables -F#因为脚本包含的默认规则为“禁止所有访问”#当其它规则被清除后,系统表现为无法访问状态,需要重启系统恢复#iptables -L 查看当前已应 ...

  9. apache2.4下载与安装

    step1 下载apache 百度“apache下载”,找到官网链接,如下 2. 点进去后选择 Files for microsoft windows,如下 3. 前三个任选一个,这里我们选第一个,如 ...

  10. C# C/S系统开发平台版本区别

    各版本功能区别   C/S系统开发框架-企业版 V4.0 (Enterprise Edition) 简介: http://www.csframework.com/cs-framework-4.0.ht ...