亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

ASP.NET MVC中使用Nhibernate(一)

系統 3065 0

 一,摘要  

在本篇文章中我們覆蓋如何安裝配置Nhibernate,以及在MVC中如何使用它.

 二,什么是Nhibernate  

Nhibernate是一個應用于.NET中的對象-關系映射器,它將對象模型映射到關系型數據庫,在本文中你將看到Nhibernate處理大部分持久層相關聯的任務.

 三,安裝Nhibernate  

下載壓縮包,并且解壓到你的電腦上,這樣就安裝好了.

 四,創建ASP.NET MVC項目  

創建一個新的MVC項目,伴隨著單元測試項目.添加兩個類庫:Infrastructure與Core.這是一個非常簡單的模型幫助我們理解Nhibernate是如何工作的:一個博客帖子屬于一個或者多個類別,一個類別可能擁有一個或者多個帖子
 張軍博客
我們將使用SQL Server2008速成版創建我們的數據庫,當然也可以在Visual Studio里創建模型,然后通過編寫Nhibernate配置去創建數據庫.

 五,創建模型  

下一步去創建我們的模型,它是我們的數據庫面向對象的表現,我們將使用Visual Studio的類設計器創建它
 張軍博客  

 六,Repositories  

repository允許我們去創建,查詢,更新,刪除我們的對象.repository獨立于數據庫.我們將創建2個repository:PostRepository與CategoryRepository,兩個repositorys將實現如下接口:
IRepository.cs
 

 1:  using System;

  <!--CRLF-->        

 2:  using System.Collections.Generic;

  <!--CRLF-->        

 3:  using System.Linq;

  <!--CRLF-->        

 4:  using System.Text;

  <!--CRLF-->        

 5:  using System;

  <!--CRLF-->        

 6:  using System.Collections.Generic;

  <!--CRLF-->        

 7:  using System.Linq;

  <!--CRLF-->        

 8:  using System.Text;

  <!--CRLF-->        

 9:

  <!--CRLF-->        

10:  namespace Core

  <!--CRLF-->        

11: {

  <!--CRLF-->        

12:  public  interface IRepository<t></t>

  <!--CRLF-->        

13: {

  <!--CRLF-->        

14:  void Save(T entity);

  <!--CRLF-->        

15:  void Update(T entity);

  <!--CRLF-->        

16:  void Delete(Guid id);

  <!--CRLF-->        

17: T GetById(Guid id);

  <!--CRLF-->        

18: T GetAll();

  <!--CRLF-->        

19: }

  <!--CRLF-->        

20: }

  <!--CRLF-->

去創建repositorys,我們首先需要創建一個輔助類NHibernate session
NHibernateHelper.cs
 

 1:  using System;

  <!--CRLF-->        

 2:  using System.Collections.Generic;

  <!--CRLF-->        

 3:  using System.Linq;

  <!--CRLF-->        

 4:  using System.Text;

  <!--CRLF-->        

 5:  using NHibernate.Cfg;

  <!--CRLF-->        

 6:  using NHibernate;

  <!--CRLF-->        

 7:

  <!--CRLF-->        

 8:  namespace Core.Domain.Repositories

  <!--CRLF-->        

 9: {

  <!--CRLF-->        

10:  public  class NHibernateHelper

  <!--CRLF-->        

11: {

  <!--CRLF-->        

12:  private  static ISessionFactory _sessionFactory;

  <!--CRLF-->        

13:

  <!--CRLF-->        

14:  private  static ISessionFactory SessionFactory

  <!--CRLF-->        

15: {

  <!--CRLF-->        

16: get

  <!--CRLF-->        

17: {

  <!--CRLF-->        

18:  if (_sessionFactory ==   null)

  <!--CRLF-->        

19: {

  <!--CRLF-->        

20: var configuration =   new Configuration();

  <!--CRLF-->        

21: configuration.Configure();

  <!--CRLF-->        

22: _sessionFactory = configuration.BuildSessionFactory();

  <!--CRLF-->        

23: }

  <!--CRLF-->        

24:  return _sessionFactory;

  <!--CRLF-->        

25: }

  <!--CRLF-->        

26: }

  <!--CRLF-->        

27:

  <!--CRLF-->        

28:  public  static ISession OpenSession()

  <!--CRLF-->        

29: {

  <!--CRLF-->        

30:  return SessionFactory.OpenSession();

  <!--CRLF-->        

31: }

  <!--CRLF-->        

32: }

  <!--CRLF-->        

33: }

  <!--CRLF-->

下一步我們創建repositorys
PostRepository.cs
 

 1:  using System;

  <!--CRLF-->        

 2:  using System.Collections.Generic;

  <!--CRLF-->        

 3:  using System.Linq;

  <!--CRLF-->        

 4:  using System.Text;

  <!--CRLF-->        

 5:  using Core.Domain.Model;

  <!--CRLF-->        

 6:  using NHibernate;

  <!--CRLF-->        

 7:  using NHibernate.Criterion;

  <!--CRLF-->        

 8:

  <!--CRLF-->        

 9:  namespace Core.Domain.Repositories

  <!--CRLF-->        

10: {

  <!--CRLF-->        

11:  public  class PostRepository: IRepository<post></post>

  <!--CRLF-->        

12: {

  <!--CRLF-->        

13:  #region IRepository<post> Members</post>

  <!--CRLF-->        

14:

  <!--CRLF-->        

15:  void IRepository<post>.Save(Post entity)</post>

  <!--CRLF-->        

16: {

  <!--CRLF-->        

17:  using (ISession session = NHibernateHelper.OpenSession())

  <!--CRLF-->        

18: {

  <!--CRLF-->        

19:  using (ITransaction transaction = session.BeginTransaction())

  <!--CRLF-->        

20: {

  <!--CRLF-->        

21: session.Save(entity);

  <!--CRLF-->        

22: transaction.Commit();

  <!--CRLF-->        

23: }

  <!--CRLF-->        

24: }

  <!--CRLF-->        

25: }

  <!--CRLF-->        

26:

  <!--CRLF-->        

27:  void IRepository<post>.Update(Post entity)</post>

  <!--CRLF-->        

28: {

  <!--CRLF-->        

29:  using (ISession session = NHibernateHelper.OpenSession())

  <!--CRLF-->        

30: {

  <!--CRLF-->        

31:  using (ITransaction transaction = session.BeginTransaction())

  <!--CRLF-->        

32: {

  <!--CRLF-->        

33: session.Update(entity);

  <!--CRLF-->        

34: transaction.Commit();

  <!--CRLF-->        

35: }

  <!--CRLF-->        

36: }

  <!--CRLF-->        

37: }

  <!--CRLF-->        

38:

  <!--CRLF-->        

39:  void IRepository<post>.Delete(Guid id)</post>

  <!--CRLF-->        

40: {

  <!--CRLF-->        

41:  using (ISession session = NHibernateHelper.OpenSession())

  <!--CRLF-->        

42: {

  <!--CRLF-->        

43:  using (ITransaction transaction = session.BeginTransaction())

  <!--CRLF-->        

44: {

  <!--CRLF-->        

45: session.Delete(id);

  <!--CRLF-->        

46: transaction.Commit();

  <!--CRLF-->        

47: }

  <!--CRLF-->        

48: }

  <!--CRLF-->        

49: }

  <!--CRLF-->        

50:

  <!--CRLF-->        

51: Post IRepository<post>.GetById(Guid id)</post>

  <!--CRLF-->        

52: {

  <!--CRLF-->        

53:  using (ISession session = NHibernateHelper.OpenSession())

  <!--CRLF-->        

54:  return session.CreateCriteria<post>().Add(Restrictions.Eq(<span style="color: #006080">"Id"</span>, id)).UniqueResult<post>();</post></post>

  <!--CRLF-->        

55: }

  <!--CRLF-->        

56:

  <!--CRLF-->        

57: Post IRepository<post>.GetAll()</post>

  <!--CRLF-->        

58: {

  <!--CRLF-->        

59:  throw  new NotImplementedException();

  <!--CRLF-->        

60: }

  <!--CRLF-->        

61:

  <!--CRLF-->        

62:  #endregion

  <!--CRLF-->        

63: }

  <!--CRLF-->        

64: }

  <!--CRLF-->

CategoryRepository.cs
 

 1:  using System;

  <!--CRLF-->        

 2:  using System.Collections.Generic;

  <!--CRLF-->        

 3:  using System.Linq;

  <!--CRLF-->        

 4:  using System.Text;

  <!--CRLF-->        

 5:  using Core.Domain.Model;

  <!--CRLF-->        

 6:  using NHibernate;

  <!--CRLF-->        

 7:  using NHibernate.Criterion;

  <!--CRLF-->        

 8:

  <!--CRLF-->        

 9:  namespace Core.Domain.Repositories

  <!--CRLF-->        

10: {

  <!--CRLF-->        

11:  public  class CategoryRepository: IRepository<category></category>

  <!--CRLF-->        

12: {

  <!--CRLF-->        

13:  #region IRepository<category> Members</category>

  <!--CRLF-->        

14:

  <!--CRLF-->        

15:  void IRepository<category>.Save(Category entity)</category>

  <!--CRLF-->        

16: {

  <!--CRLF-->        

17:  using (ISession session = NHibernateHelper.OpenSession())

  <!--CRLF-->        

18: {

  <!--CRLF-->        

19:  using (ITransaction transaction = session.BeginTransaction())

  <!--CRLF-->        

20: {

  <!--CRLF-->        

21: session.Save(entity);

  <!--CRLF-->        

22: transaction.Commit();

  <!--CRLF-->        

23: }

  <!--CRLF-->        

24: }

  <!--CRLF-->        

25: }

  <!--CRLF-->        

26:

  <!--CRLF-->        

27:  void IRepository<category>.Update(Category entity)</category>

  <!--CRLF-->        

28: {

  <!--CRLF-->        

29:  using (ISession session = NHibernateHelper.OpenSession())

  <!--CRLF-->        

30: {

  <!--CRLF-->        

31:  using (ITransaction transaction = session.BeginTransaction())

  <!--CRLF-->        

32: {

  <!--CRLF-->        

33: session.Update(entity);

  <!--CRLF-->        

34: transaction.Commit();

  <!--CRLF-->        

35: }

  <!--CRLF-->        

36: }

  <!--CRLF-->        

37: }

  <!--CRLF-->        

38:

  <!--CRLF-->        

39:  void IRepository<category>.Delete(Guid id)</category>

  <!--CRLF-->        

40: {

  <!--CRLF-->        

41:  using (ISession session = NHibernateHelper.OpenSession())

  <!--CRLF-->        

42: {

  <!--CRLF-->        

43:  using (ITransaction transaction = session.BeginTransaction())

  <!--CRLF-->        

44: {

  <!--CRLF-->        

45: session.Delete(id);

  <!--CRLF-->        

46: transaction.Commit();

  <!--CRLF-->        

47: }

  <!--CRLF-->        

48: }

  <!--CRLF-->        

49: }

  <!--CRLF-->        

50:

  <!--CRLF-->        

51: Category IRepository<category>.GetById(Guid id)</category>

  <!--CRLF-->        

52: {

  <!--CRLF-->        

53:  using (ISession session = NHibernateHelper.OpenSession())

  <!--CRLF-->        

54:  return session.CreateCriteria<category>().Add(Restrictions.Eq(<span style="color: #006080">"Id"</span>, id)).UniqueResult<category>();</category></category>

  <!--CRLF-->        

55: }

  <!--CRLF-->        

56:

  <!--CRLF-->        

57: Category IRepository<category>.GetAll()</category>

  <!--CRLF-->        

58: {

  <!--CRLF-->        

59:  throw  new NotImplementedException();

  <!--CRLF-->        

60: }

  <!--CRLF-->        

61:

  <!--CRLF-->        

62:  #endregion

  <!--CRLF-->        

63: }

  <!--CRLF-->        

64: }

  <!--CRLF-->

我們看到在Repository中首先創建Session然后調用Nhibernate中的方法

 七,回顧  

到目前為止,我們做了如下事情:
1.創建Core類庫,引用Nhibernate程序集
2.在Core類庫里我們創建了兩個模型類:"Post.cs”,"Category.cs”,post類有一個指向category類的集合
3.創建了兩個Repository去查詢,更新,刪除,編輯我們的模型

 八,映射  

現在在我們的Infrastructure類庫中創建模型層到數據庫的映射,我們需要在Nhibernate中配置XML文件,命名遵循[ClassName].hbm.xml的規范
我們將創建兩個新文件:Category.hbm.xml 與Post.hbm.xml,每一個類映射到數據庫中的一張表,屬性映射到表中的列,當然你也能制定數據類型,首先我們創建Category.hbm.xml文件:
 

 1:  xml  version  ="1.0"  encoding  ="utf-8" ?  >

  <!--CRLF-->        

 2:  hibernate-mapping            xmlns            ="urn:nhibernate-mapping-2.2"

  <!--CRLF-->        

 3:  namespace  ="Core.Domain.Model"

  <!--CRLF-->        

 4:  assembly  ="Core"  >

  <!--CRLF-->        

 5:

  <!--CRLF-->        

 6:  class            name            ="Category"            table            ="Categories"            dynamic-update            ="true"            >

  <!--CRLF-->        

 7:  cache            usage            ="read-write"            />

  <!--CRLF-->        

 8:  id            name            ="Id"            column            ="Id"            type            ="Guid"            >

  <!--CRLF-->        

 9:  generator            class            ="guid"            />

  <!--CRLF-->        

10:  id  >

  <!--CRLF-->        

11:  property            name            ="Name"            length            ="100"            />

  <!--CRLF-->        

12:  class  >

  <!--CRLF-->        

13:  hibernate-mapping  >

  <!--CRLF-->

注意:一定要設置每個映射文件的簡歷動作為"Embedded Resource",這樣Nhibernate就能在程序集中找到正確的文件

 九,配置Nhibernate  

下一步我們在hibernate.cfg.xml文件中設置Nhibernate的連接以及參數,在動態代理系統中,Nhibernate有一個"Lazy-Loading"特性,我們需要添加如下程序集去支持它:
1.Castle.Core
2.Castle.DynamicProxy2
3.NHibernate.ByteCode.Castle.dll
然后創建如下配置文件:
hibernate.cfg.xml
 

 1:  hibernate-configuration            xmlns            ="urn:nhibernate-configuration-2.2"            >

  <!--CRLF-->        

 2:  session-factory            >

  <!--CRLF-->        

 3:  property            name            ="connection.driver_class"            >            NHibernate.Driver.SqlClientDriver              property            >

  <!--CRLF-->        

 4:  property            name            ="connection.connection_string"            >            server=./SQLExpress;database=NHibernate101;Integrated Security=true;              property            >

  <!--CRLF-->        

 5:  property            name            ="show_sql"            >            true              property            >

  <!--CRLF-->        

 6:  property            name            ="dialect"            >            NHibernate.Dialect.MsSql2008Dialect              property            >

  <!--CRLF-->        

 7:  property            name            ="cache.use_query_cache"            >            false              property            >

  <!--CRLF-->        

 8:  property            name            ="adonet.batch_size"            >            100              property            >

  <!--CRLF-->        

 9:  property            name            ="proxyfactory.factory_class"            >            NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle              property            >

  <!--CRLF-->        

10:  mapping            assembly            ="Infrastructure"            />

  <!--CRLF-->        

11:  session-factory  >

  <!--CRLF-->        

12:  hibernate-configuration  >

  <!--CRLF-->

 十,測試  

現在我們去測試我們的Nhibernate配置,通過測試我們添加一些數據到我們的"Categories"表,那么首先要引用Nbibernate程序集以及拷貝hibernate.cfg.xml到我們的測試項目下,添加如下引用:
1.Castle.Core
2.Castle.DynamicProxy2
3.Infrastructure
4.NHibernate
5.NHibernate.ByteCode.Castle
添加如下測試方法:
 

   1:             [TestMethod]

  <!--CRLF-->        

   2:           [DeploymentItem(          "hibernate.cfg.xml"            )]

  <!--CRLF-->        

   3:            public            void             CanCreateCategory()

  <!--CRLF-->        

   4:           {

  <!--CRLF-->        

   5:           IRepository<category> repo = <span style="color: #0000ff">new</span> CategoryRepository();</category>

  <!--CRLF-->        

   6:           Category category = 
          new             Category();

  <!--CRLF-->        

   7:           category.Name = 
          "ASP.NET"            ;

  <!--CRLF-->        

   8:

  <!--CRLF-->        

   9:           repo.Save(category);

  <!--CRLF-->        

   10:

  <!--CRLF-->        

   11:           }

  <!--CRLF-->

運行我們的測試方法,我們將看到測試方法成功通過:  
 張軍博客    
 核查我們的數據庫,查看category是否已經添加:  
 張軍博客    

隨下的文章中我們將繼續探索!


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久久夜 | 91视频一88av| 久久久久亚洲视频 | 午夜在线一区 | 久草视频在线免费播放 | 欧美日韩国产在线 | 久草手机在线观看 | 日本成人a视频 | 国产合集福利视频在线视频 | 中文字幕日韩精品一区口 | 久草香蕉视频在线观看 | 亚洲美女啪啪 | 曰本不卡视频 | 青青青视频在线 | 狠狠综合久久久久综合小说网 | 久久国产亚洲观看 | 亚洲欧美日韩激情在线观看 | 日日摸夜夜添夜夜添人人爽 | 欧美日韩中文国产一区 | 四虎最新紧急更新地址 | 国内精品51视频在线观看 | 五月亭亭免费高清在线 | 狠狠干狠 | 2020久久国产精品福利 | 99九九99九九九视频精品 | 欧美成人xxxx | 成人欧美在线观看免费视频 | 婷婷色九月综合激情丁香 | 99精品国产第一福利网站 | 中文字幕一区在线播放 | 国产专区精品 | 亚洲黄色网址大全 | 国产亚洲精品九九久在线观看 | 国产无套免费网站 | 国产91在线 | 日韩 | 真实子伦视频不卡 | 午夜性a一级毛片 | 视频一区在线播放 | 久久99国产视频 | 天天干夜夜曰 | 午夜视频在线网站 |