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的方式刪除,在這里忽略了。

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM