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的方式删除,在这里忽略了

posted @ 2015-12-09 09:55  他乡客  阅读(228)  评论(0编辑  收藏  举报