問題是這樣的,有兩個表:文章(Article)和分類(Lable),這兩者之間的關系是多對多關聯,如果你用Nhibernate來保存數據的話非常的好操作,新建Article,然后把Lable值賦值給Article的Lables(這個是在Article類里面有定義的),像這樣:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace MyMvc4Project.Models { /// <summary> /// t_Article:實體類(屬性說明自動提取數據庫字段的描述信息) /// </summary> [Serializable] public class Article { /// <summary> /// id /// </summary> public string Id { get; set; } /// <summary> /// 標題 /// </summary> public string Title { get; set; } /// <summary> /// 內容 /// </summary> public string Contents { get; set; } /// <summary> /// 點擊瀏覽次數 /// </summary> public int ClickCount { get; set; } /// <summary> /// 創建時間 /// </summary> public DateTime? CreateTime { get; set; } /// <summary> /// 更新時間 /// </summary> public DateTime? UpdateTime { get; set; } public IList<Lable> Lables { get; set; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace MyMvc4Project.Models { /// <summary> /// t_Lable:實體類(屬性說明自動提取數據庫字段的描述信息) /// </summary> [Serializable] public class Lable { /// <summary> /// id /// </summary> public string Id { get; set; } /// <summary> /// 標簽名 /// </summary> public string Name { get; set; } /// <summary> /// 顯示等級 /// </summary> public int Level { get; set; } /// <summary> /// 創建時間 /// </summary> public DateTime? CreateTime { get; set; } /// <summary> /// 文章 /// </summary> public IList<Article> Articles { get; set; } } }
上面定義的是文章類和分類類別類,現在要保存文章數據,像這樣:
Article article =new Article() article.Id=Guid.NewGuid().toString(); article.Title=title; article.Contents=contents; article.CreateTime=DateTime.Now(); article.UpdateTime=DateTime.Now(); article.Lables=lableList; _session.Save(article);
這樣的保存好操作,但是我在級聯更新的時候遇到問題了,在網上搜索了一下,好像國內使用Nhibernate的人特別少,資料也很少,好像在博客園里Nhibernate比較專業一點的就只有李永京的博客了,不過我沒有找到關於級聯更新的文章,非常的遺憾。於是我又在官網上查找Nhibernate級聯的資料,於是我按照官網上的資料這樣操作:
public void Update(Article bean) { //這行代碼非常的重要,對於nhibernate多對多級聯更新 var article = (Article)_session.Load(typeof(Article), bean.Id); var lblList = bean.Lables.Select( lable => (Lable) _session.Load(typeof (Lable), lable.Id) ).ToList(); article.User = bean.User; article.Title = bean.Title; article.Contents = bean.Contents; article.UpdateTime = DateTime.Now; article.Lables = lblList; try { _session.Update(article); _session.Flush(); } catch (Exception) { throw; } }
分析:
官網的思路是這樣的,先用
var article = (Article)_session.Load(typeof(Article), bean.Id);
通過文章id獲取到文章數據,然后再賦值更新,而且所關聯的分類數據(Lable)也是這樣操作的(先獲取后更新),我不知道這樣做是不是正確的,也希望博客園里的專家看了我的文章后提出自己的意見或建議,這樣我才知道我這樣做是不是很完美。
我還在想一個問題,如果所關聯的數據有千萬條的話,這樣關聯的更新是不是影響性能?唉,對Nhibernate存在着無數的問題。