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):一个完整的例子的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 目标跟踪【更新中...】
- 下一篇: OracleExcel VBA写获取表字