本文基于Nhibernate 3.0 Cookbook,下載地址:http://home.cnblogs.com/group/topic/42850.html
創(chuàng)新互聯(lián)主要從事成都網(wǎng)站建設、網(wǎng)站建設、網(wǎng)頁設計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務。立足成都服務鶴山,10余年網(wǎng)站建設經(jīng)驗,價格優(yōu)惠、服務專業(yè),歡迎來電咨詢建站服務:028-86922220準備工作,下載Nhibernate:http://sourceforge.net/projects/nhibernate/files/NHibernate/3.0.0.GA/
因為是基于Nhibernate 3.0 Cookbook,所以用的版本也是書上的一致,不是最新的。
下面我們來說說如何通過配置類的XML文件,最后在數(shù)據(jù)庫中生成相應的表。
一 創(chuàng)建一個簡單的類映射。
1.新建一個類庫項目:Eg.Core,并將解決方命名為:CookbookDemo。
2.在解決方案目錄下,新建一個文件夾:Lib,并將下載的Nhibernate中Required_Bin folder和Required_For_LazyLoadingCastle目錄中的文件解壓到些文件夾中。
3.在類庫項目:Eg.Core中,新建一個類Entity,代碼如下:
public abstract class Entity
{
public virtual Guid Id { get; protected set; }
}
4.在新建一個類:Product
public class Product : Entity
{
public virtual string Name { get; set; }
public virtual string Description { get; set; }
public virtual Decimal UnitPrice { get; set; }
}
5.在項目Eg.Core中添加一個XML文件,命名為:Product.hbm.xml,右鍵該XML文件,選擇屬性,將生成操作改成:嵌入的資源。這個很重要,不然Nhbernate會找不到你所配置的XML文件。
打開Product.hbm.xml,配置hibernate-mapping如下:
PS:為了讓配置XML時出現(xiàn)智能提示,在下載的NHibernate中找到configuration.xsd和nhibernate-mapping.xsd兩個文件并復制到你的VS安裝目錄:X:Program FilesMicrosoft Visual Studio 9.0XmlSchemas目錄即可。
6. 這樣,Eg.Core項目就完成了,點擊生成,確認沒有錯誤后,我們再新建一個控制臺項目:CookBookDemo,在項目中添加對Nhibernate.dll, NHibernate.ByteCode.Castle.dll,Eg.Core.dll的引用。
7.在CookBookDemo項目中添加配置文件:app.cofig
NHibernate.ByteCode.Castle.ProxyFactoryFactory,
NHibernate.ByteCode.Castle
NHibernate.Dialect.MsSql2008Dialect,
NHibernate
db
100
8 在program.cs中添加如下代碼:
using System;
using NHibernate.Cfg;
using NHibernate.Tool.hbm2ddl;
namespace CookBookDemo
{
class Program
{
static void Main(string[] args)
{
var nhConfig = new Configuration().Configure();
var schemaExport = new SchemaExport(nhConfig);
schemaExport.Create(false, true);
Console.WriteLine("NHibernate Configured!");
Console.ReadKey();
}
}
}
9 將CookbookDemo設置為啟動項目然后調(diào)試,控制臺上輸出:NHibernate Configured后再打開你的數(shù)據(jù)庫,就可以看到生成的Product表了。
二、創(chuàng)建一個層次結(jié)構(gòu)的映射。
比如,我們有兩個具體的產(chǎn)品:Movie與Book,它們繼承Product
我們先來看看存儲在同一張表,即Product中:
1.在項目Eg.Core中新增兩個類:Movie與Book
public class Movie : Product
{
public virtual string Director { get; set; }
}
public class Book : Product
{
public virtual string ISBN { get; set; }
public virtual string Author { get; set; }
}
2.因為是存在同一張表中,所以為了區(qū)別Movie與Book,在Product中增加一個字段用于將它們區(qū)分開來,所以,我們要修改Product.hbm.xml
discriminator 節(jié)點中的值就是區(qū)分字段,默認情況下它的值就是類的名稱,所以在本例中,它的值可能為:Eg.Core.Product, Eg.Core.Book, 與 Eg.Core.Movie。當然你也可以手動的通過在類或子類節(jié)點中增加discriminator-value屬性來設置該類的鑒別值。如:
3.在項目中增加Movie.hbm.xml與Book.hbm.xml,注意要將生成操作改成:嵌入的資源。
4.編譯并執(zhí)行項目:CookbookDemo,執(zhí)行成功后,打開數(shù)據(jù)庫,我們可以看到新生成的Product表結(jié)構(gòu)如下:
我們也可以將每個類存儲在獨立的表中,這也分兩種情況:子類與父類之間有外鍵約束與沒有外鍵約束
有外鍵約束的情況
1.Product.hbm.xml中去掉節(jié)點:discriminator,因為是存儲在獨立的表中,所以就不需要這個了。
2.修改Movie.hbm.xml為:
3.修改Book.hbm.xml為:
4.編譯并執(zhí)行項目:CookbookDemo,執(zhí)行成功后,打開數(shù)據(jù)庫,會看到有三張表:Book,Movie與Product,且三張表的關(guān)系如下圖:
我們可以測試,如果嘗試在Movie或Book表中插入Product表中不存在的ID是會報錯的:
沒有外鍵約束時,三張表都真的是獨立存儲,個人感覺這時候Product表就沒什么作用了。
1.修改上面的Movie.hbm.xml為:
2.修改上面的Book.hbm.xml為:
3.編譯并執(zhí)行項目:CookbookDemo.打開數(shù)據(jù)庫,表之間的關(guān)系圖如一下:
三 一對多映射
很多數(shù)據(jù)都會出現(xiàn)一對多的情況,我們增加一個類ActorRole,它與Movie之間的關(guān)系是一對多的。
public class ActorRole : Entity
{
public virtual string Actor { get; set; }
public virtual string Role { get; set; }
}
再增加該類的XML文件:
修改Movie類:
public class Movie : Product
{
public virtual string Director { get; set; }
public virtual IList Actors { get; set; }
}
修改Movie.hbm.xml文件:
all-delete-orphan表明,刪除一個Movie時,與該Movie相關(guān)聯(lián)的ActorRole也會被刪除。