zoukankan      html  css  js  c++  java
  • NHibernate 之数据操作 (第五篇)

      数据操作,在这里主要介绍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的方式删除,在这里忽略了

  • 相关阅读:
    保持URL不变和数字验证
    centOS ftp key?
    本地环境测试二级域名
    linux 解决You don't have permission to access 问题
    php smarty section loop
    php header Cannot modify header information headers already sent by ... 解决办法
    linux部分命令
    Linux 里面的文件操作权限说明
    用IT网络和安全专业人士视角来裁剪云的定义
    SQL Server 2008 R2炫酷报表"智"作有方
  • 原文地址:https://www.cnblogs.com/liuguanghai/p/5031890.html
Copyright © 2011-2022 走看看