数据操作,在这里主要介绍INSERT、UPDATE、DELETE。我们在使用NHibernate的时候,如果只是查询数据,不需要改变数据库的值,那么是不需要提交或者回滚到数据库的。

一、INSERT

  通过调用ISession.Save()方法,然后同步同步到数据库。

  Program.cs

    class Program
{
static void Main(string[] args)
{
ISessionFactory sessionFactory = new Configuration().Configure().BuildSessionFactory();
ISession session = sessionFactory.OpenSession(); PersonModel p = new PersonModel();
p.Id = 5;
p.Name = "郭嘉";
session.Save(p);
session.Flush();  //执行此行代码,才真正提交到数据库 Console.ReadKey();
}
}

  输出结果如下:

  

  NHibernate执行了插入语句。

  如果在添加的时候想知道NHibernate返回的Id以判断添加是否成功,可以这样写:

  public bool Add(Ad ad)
  {
    return (int)NHibernateHelper.GetSession().Save(ad) > 0;
  }

二、UPDATE

  通过调用ISession.Update,同步到数据库。

  Program.cs

    class Program
{
static void Main(string[] args)
{
ISessionFactory sessionFactory = new Configuration().Configure().BuildSessionFactory();
ISession session = sessionFactory.OpenSession(); PersonModel p = session.Get<PersonModel>(1);
p.Name = p.Name + "Nhiberante修改名字!";
session.Update(p);
session.Flush(); Console.ReadKey();
}
}

  输出如下:

  

  不知道为什么UPDATE语句为什么不显示出来,但是数据库已经更改了。

  

三、SaveOrUpdate

  NHibernate能够做到自动判断是应该执行INSERT还是UPDATE。这就是SaveOrUpdate()方法,当我们执行这个方法的时候,NHibernate完成如下工作:

  • 检查这个对象是否已经存在Session中。
  • 如果对象不在,调用Save(object)来保存。
  • 如果对象存在,检查这个对象是否改变了。
  • 如果对象改变,调用Update(object)来更新。

  Program.cs

    class Program
{
static void Main(string[] args)
{
ISessionFactory sessionFactory = new Configuration().Configure().BuildSessionFactory(); using (ISession session = sessionFactory.OpenSession())
{
PersonModel p1 = session.Get<PersonModel>(1);
p1.Name = p1.Name + "Nhiberante修改名字!";
session.SaveOrUpdate(p1);
} using (ISession session = sessionFactory.OpenSession())
{
PersonModel p2 = new PersonModel();
p2.Name = "曹仁";
session.SaveOrUpdate(p2);
} Console.ReadKey();
}
}

  输出如下:

  

  UPDATE语句,一样没show,不知道什么原因,另外要注意的是,如果你配置了Id由数据库生成,希望insert的数据,不要添加Id编号。否则SaveOrUpdate会报异常,有了Id,NHibernate会执行UPDATE,而数据库没有此行数据,因此报错。

  

四、DELETE

  查出一个对象,调用ISession.Delete(),同步到数据库。

  Program.cs

    class Program
{
static void Main(string[] args)
{
ISessionFactory sessionFactory = new Configuration().Configure().BuildSessionFactory(); using (ISession session = sessionFactory.OpenSession())
{
PersonModel p1 = session.Get<PersonModel>(1);
session.Delete(p1);
session.Flush();
} Console.ReadKey();
}
}

  数据库显示如下:

  

  但是这种方法也有个问题,这种方法要先把这条记录查出来(SELECT),然后映射成实体,然后再把实体传回去执行删除操作(DELETE)。这样处理可能能够解决缓存与数据库同步等一系列问题。

  HQL是NHibernate特有的操作语言,它能够理解,既然能理解那么就能正常处理与缓存的关系(未实测),不过跟踪了SQL语句,还是先查询后删除,唯一不同只是返回多了一个影响行数。

  public int Delete(int Id)
  {
    int Count = NHibernateHelper.GetSession().Delete("from Ad ad where ad.Id = ?", Id, NHibernateUtil.Int32);
    NHibernateHelper.GetSession().Flush();
    return Count;
  }

  如果不使用NHibernate的缓存功能,可以考虑使用CreateSQLQuery的方式删除,在这里忽略了。

Nhibernate系列学习之(四) 数据操作的更多相关文章

  1. mysql四:数据操作

    一 介绍 MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过SQL语句中的 ...

  2. Mysql(四):数据操作

    一 介绍 MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过SQL语句中的 ...

  3. jQuery 源码分析(十四) 数据操作模块 类样式操作 详解

    jQuery的属性操作模块总共有4个部分,本篇说一下第3个部分:类样式操作部分,用于修改DOM元素的class特性的,对于类样式操作来说,jQuery并没有定义静态方法,而只定义了实例方法,如下: a ...

  4. NHibernate 之数据操作 (第五篇)

    数据操作,在这里主要介绍INSERT.UPDATE.DELETE.我们在使用NHibernate的时候,如果只是查询数据,不需要改变数据库的值,那么是不需要提交或者回滚到数据库的. 一.INSERT ...

  5. MySQL 第四篇:数据操作

    一 介绍 MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过SQL语句中的 ...

  6. SQL学习笔记四之MySQL数据操作

    阅读目录 一 介绍 二 插入数据INSERT 三 更新数据UPDATE 四 删除数据DELETE 五 查询数据SELECT 六 权限管理 一 介绍 MySQL数据操作: DML =========== ...

  7. mysql四:数据操作

    一.介绍 MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过SQL语句中的 ...

  8. mysql第四篇:数据操作

    第四篇:数据操作 一.数据操作介绍 在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作 1.INSERT实现数据的插入 2.UPDATE实现数据的更新 3.DELETE实现数据的 ...

  9. mysql第四篇:数据操作之多表查询

    mysql第四篇:数据操作之多表查询 一.多表联合查询 #创建部门 CREATE TABLE IF NOT EXISTS dept ( did int not null auto_increment ...

随机推荐

  1. loadrunder之脚本篇——定义全局变量

    如果参数是全局的,在脚本中的任何一个Action中都可以使用,变量一般是局部的,如果跨Action调用会出现未声明的错误. 打开Script视图中左侧Action列表中的globals.h文件,可定义 ...

  2. Jquery.ScrollLoading图片延迟加载技术

    关于分屏加载图片,像天猫.京东等电商图片较多页面很长,就采用了延迟加载技术. 目前很流行的做法就是滚动动态加载,显示屏幕之外的图片默认是不加载的, 随着页面的滚动,显示区域图片才被动态加载. 原理其实 ...

  3. 通过加载Xib文件来创建UITableViewCell造成复用数据混乱问题方案

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPa ...

  4. Android : 反射机制获取或设置系统属性(SystemProperties)【转】

    本文转载自:https://blog.csdn.net/wei_lei/article/details/70312512 Android.os.SystemProperties 提供了获取和设置系统属 ...

  5. kubernetes 核心对象

    Pods Pod是Kubernetes的基本操作单元,也是应用运行的载体.整个Kubernetes系统都是围绕着Pod展开的,比如如何部署运行Pod.如何保证Pod的数量.如何访问Pod等.另外,Po ...

  6. 一键安装 lnmp/lamp/lanmp

    1.使用putty或类似的SSH工具登陆VPS或服务器 # screen -S lnmp 如果提示screen: command not found 命令不存在可以执行:yum install scr ...

  7. HMM代码实现

    按照网上的代码,自己敲了一下,改了一点点,理解加深了一下. 还有训练HMM的EM算法没看懂,下次接着看: 参考连接:http://www.cnblogs.com/hanahimi/p/4011765. ...

  8. gzip: stdin: unexpected end of file tar: Unexpected EOF in archive

    1.问题描述: 今天解压tar包遇到这样一个问题 使用命令:tar -zxvf  xxxxx.tar.gz gzip: stdin: unexpected end of filetar: Unexpe ...

  9. BZOJ2764 [JLOI2011]基因补全

    Description 在 生物课中我们学过,碱基组成了DNA(脱氧核糖核酸),他们分别可以用大写字母A,C,T,G表示,其中A总与T配对,C总与G配对.两个碱基序列能相互 匹配,当且仅当它们等长,并 ...

  10. libvirt cpu mode

    libvirt中 cpu mode可以有以下3种: custom : 该模式下cpu element用来描述guest可见的CPU,该模式也是mode的default模式,它会使得persistent ...