日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NHibernate初学者指南(2):一个完整的例子

發布時間:2025/3/17 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NHibernate初学者指南(2):一个完整的例子 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

準備開發環境

操作系統:Windows Vista, Windows 7, Windows Server 2003 或 Windows Server 2008

IDE:VS 2010 Professional, VS C# 2010 Express 或 VS Basic 2010 Express

如果不使用Visual Studio,可以使用開源的IDE:

  • MonoDevelop,它是是專門為C#和其他.NET語言設計的IDE。可以從這里下載。
  • SharpDevelop,它是.NET平臺下C#,VB.NET和Boo項目的免費IDE。,可以從這里下載。

數據庫:NHibernate支持主流的關系型數據庫,像Oracle,MS SQL Server,MySQL等。我們使用MS SQL Server作為我們的RDBMS,在后面寫測試時還會使用SQLite。我安裝的是MS SQL Server2008 。

準備NHibernate:從Fluent NHibernate下載,就包括程序所需的所有文件。

定義Model

這個例子叫產品庫存系統,我們想使用這個程序管理一個小型雜貨店的產品列表。產品按類別分組。類別由名字和簡短的描述組成。產品有名字,簡短描述,類別,單價,重新排序級別,以及一個標識,決定產品是否下架。為了唯一的標識每個類別和產品,它們都有一個ID。如果畫一下我們所描述Model的類圖,則如下圖所示:

注:只有VS的Professional版本類設計器可用,免費的Express版本不可用

下面讓我們完成這個簡單的產品庫存系統(product inventory system)。

1. 在電腦中創建一個文件夾叫NH3BeginnersGuide,在里面再新建一個文件夾叫lib。然后將下載的Fluent NHibernate解壓縮到lib文件夾即可。

2. 打開Visual Studio,創建一個ASP.NET MVC 3 Web Application。在彈出的“New ASP.NET MVC 3 Project”對話框選擇Internet Application,點擊“OK”。

3. 在Models文件夾中 分別創建Category和Product類,代碼如下:

public class Category {public virtual int Id { get; set; }public virtual string Name { get; set; }public virtual string Description { get; set; } }

?

public class Product {public virtual int Id { get; set; }public virtual string Name { get; set; }public virtual string Description { get; set; }public virtual Category Category { get; set; }public virtual decimal UnitPrice { get; set; }public virtual int ReorderLevel { get; set; }public virtual bool Discontinued { get; set; } }

?

映射Model

定義映射有不同的方法,最常見的方法不是以XML的形式定義就是在代碼中定義。在這個例子中,選擇后者。

1. 在項目中引用FluentNHibernate.dll和NHibernate.dll。

2. 在Models中分別創建CategoryMap和ProductMap類,讓它們都繼承自ClassMap<T>類,代碼如下:

public class CategoryMap : ClassMap<Category> {public CategoryMap(){Id(x => x.Id);Map(x => x.Name).Length(50).Not.Nullable();Map(x => x.Description);} }

?

public class ProductMap : ClassMap<Product> {public ProductMap(){Id(x => x.Id);Map(x => x.Name).Length(50).Not.Nullable();Map(x => x.Description);Map(x => x.UnitPrice).Not.Nullable();Map(x => x.ReorderLevel);Map(x => x.Discontinued);References(x => x.Category).Not.Nullable();} }

?

創建數據庫架構

我們不手動創建數據庫架構,而是讓NHibernate為我們創建它。我們需要做的只是創建一個空的數據庫。

1. 打開SSMS,選擇SQL Server身份驗證。

2. 創建一個名字為PIS的空數據庫。

3. 在Models文件夾中新建一個NHibernateHelper類,代碼如下:

public class NHibernateHelper {public static ISessionFactory CreateSessionFactory(){return Fluently.Configure().Database(MsSqlConfiguration.MsSql2008.ConnectionString(c => c.FromConnectionStringWithKey("PISConn"))).Mappings(m => m.FluentMappings.AddFromAssemblyOf<ProductMap>()).ExposeConfiguration(CreateSchema).BuildSessionFactory();}private static void CreateSchema(Configuration cfg){var schemaExport = new SchemaExport(cfg);//schemaExport.SetOutputFile("c:\\abc.sql");schemaExport.Create(false,

true

);} }

這段代碼我不解釋,在后面的文章中會詳細講解。其中注釋的一行,是NHibernate生成的創建數據庫腳本。

4. 打開Web.config,在 <connectionStrings></connectionStrings>節中添加如下代碼:

<add name="PISConn" connectionString="Data Source=.;Initial Catalog=PIS;User ID=sa;Password=sasa;Integrated Security=True" providerName="System.Data.SqlClient"/>

5. 新建一個CateogryController,Template選擇Empty controller。在Index中添加如下代碼:

var factory = NHibernateHelper.CreateSessionFactory();

6. 新建Index的View,運行程序,NHibernate會自動創建好數據庫的架構。

在C盤下找到abc.sql文件,里面的代碼如下:

if exists (select 1 from sys.objects where object_id = OBJECT_ID(N'[FK1F94D86A856F978E]') AND parent_object_id = OBJECT_ID('[Product]')) alter table [Product] drop constraint FK1F94D86A856F978Eif exists (select * from dbo.sysobjects where id = object_id(N'[Category]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [Category]if exists (select * from dbo.sysobjects where id = object_id(N'[Product]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [Product]create table [Category] (Id INT IDENTITY NOT NULL,Name NVARCHAR(50) not null,Description NVARCHAR(255) null,primary key (Id))create table [Product] (Id INT IDENTITY NOT NULL,Name NVARCHAR(50) not null,Description NVARCHAR(255) null,UnitPrice DECIMAL(19,5) not null,ReorderLevel INT null,Discontinued BIT null,Category_id INT not null,primary key (Id))alter table [Product] add constraint FK1F94D86A856F978E foreign key (Category_id) references [Category]

7. 創建好數據庫的架構后,將schemaExport.Create(false, true); 修改為schemaExport.Create(false, false); 這樣程序啟動時就不會重新生成數據庫的架構了。

實現程序的CRUD

首先,實現插入

1. 在CategoryController中添加Create Action。代碼如下:

// //Get: /Category/Create public ActionResult Create() {return View(); }[HttpPost] public ActionResult Create(Category category) {if (category.Name == null){ModelState.AddModelError("", "類別名稱不能為空");return View(category);}else{var factory = NHibernateHelper.CreateSessionFactory();using (var session = factory.OpenSession()){session.Save(category);}return RedirectToAction("Index");} }

2. 添加對應的View,代碼不貼出來了。然后運行,查看效果:

第二,實現查詢

1. 修改Index Action。代碼如下:

// // GET: /Category/public ActionResult Index() {var factory = NHibernateHelper.CreateSessionFactory();IEnumerable<Category> categories;using (var session = factory.OpenSession()){categories = session.QueryOver<Category>().List();}return View(categories); }

2. 這個步驟跟上面一樣,直接看運行效果:

第三,實現修改

1. 添加Edit Action。代碼如下:

public ActionResult Edit(int id) {var factory = NHibernateHelper.CreateSessionFactory();Category category;using (var session = factory.OpenSession()){category = session.Get<Category>(id);}return View(category); } [HttpPost] public ActionResult Edit(Category category) {var factory = NHibernateHelper.CreateSessionFactory();using (var session = factory.OpenSession()){ITransaction transactioin = session.BeginTransaction();try{session.Update(category);transactioin.Commit();}catch (Exception){transactioin.Rollback();}}return RedirectToAction("Index"); }

2. 同上,查看運行效果:

第四,實現刪除

1. 添加Delete Action。代碼如下:

public ActionResult Delete(int id) {var factory = NHibernateHelper.CreateSessionFactory();using (var session = factory.OpenSession()){ITransaction transaction = session.BeginTransaction();try{var category = session.Get<Category>(id);session.Delete(category);transaction.Commit();}catch (Exception){transaction.Rollback();}}return RedirectToAction("Index"); }

2. 不用添加View了,直接運行,查看結果:

點擊確定即可刪除記錄。

總結

本來想直接翻譯NHibernate 3 Beginner's Guid這本書上的例子,最后還是決定自己寫個例子吧。這個例子僅僅是實現了功能,沒有考慮太多的東西,相當于Hello World吧。上面用到的很多知識,在后面都會詳細講解,因為我也剛剛接觸,很多東西也沒有弄的太清楚,相信隨著學習的不斷深入,也會對NHibernate有更深刻的了解。

最后希望各位朋友指出我的不足,祈求共同進步。

源碼下載地址:http://files.cnblogs.com/nianming/NH3BeginnersGuide.rar

說明:為了減小文件大小,我將lib中的文件沒有包含進上面的源代碼

轉載于:https://www.cnblogs.com/nianming/archive/2011/11/09/2243706.html

總結

以上是生活随笔為你收集整理的NHibernate初学者指南(2):一个完整的例子的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。