導航:首頁 > 文件教程 > 映射文件nherbinate

映射文件nherbinate

發布時間:2021-04-19 07:31:39

① nhibernate怎麼實現數據的添加,刪除,修改簡單程序

一、創建資料庫
資料庫名:Nhibernate
use NHibernate
go
CREATE TABLE users (
LogonID nvarchar(20) NOT NULL default '0',
Name nvarchar(40) default NULL,
Password nvarchar(20) default NULL,
EmailAddress nvarchar(40) default NULL,
PRIMARY KEY (LogonID)
)
go
數據表:users

二、總體介紹
項目名:WebNhibernate
界面:WebForm.aspx
具體表現文件:WebForm.aspx.cs
實體類文件:EntityClass.cs
映射文件:Userhbm.xml
配置文件:Web.config

三、創建Web界面
類型
對象名
Text屬性值
Label
Label1
ID:
Label
Label2
姓名:
Label
Label3
密碼
Label
Label4
Email:
Label
Labmessage

TextBox
TxtId

TextBox
TxtName

TextBox
TxtPassword

TextBox
TxtEmail

Button
ButSave
添加
Button
ButDel
刪除
Button
ButUpdata
修改

四、創建映射文件(xml文件)和實體類
實體類
using System;
namespace WebNhibernate
{
public class EntityClass
{
private string id;
private string userName;
private string password;
private string emailAddress;
public EntityClass()
{}
public string Id
{
get { return id; }
set { id = value; }
}
public string UserName
{
get { return userName; }
set { userName = value; }
}
public string Password
{
get { return password; }
set { password = value; }
}
public string EmailAddress
{
get { return emailAddress; }
set { emailAddress = value; }
}
}
}
映射文件:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
<class name="WebNhibernate.EntityClass, WebNhibernate" table="users">
<id name="Id" column="LogonId" type="String" length="20">
<generator class="assigned" />
</id>
<property name="UserName" column= "Name" type="string" length="40"/>
<property name="Password" type="string" length="20"/>
<property name="EmailAddress" type="String" length="40"/>
</class>
</hibernate-mapping>
注意點:
1.<class name="WebNhibernate.EntityClass, WebNhibernate" table="users">
WebNhibernate.EntityClass代表:實體類名
WebNhibernate代表:該項目的裝配集名稱
Users代表:數據表名
2.當屬性列表<property name=」」 column=」」/>中既有name和column說明實體層的屬性與數據表的欄位名不同名
3.指定一個id, 在數據表中就是主鍵, 這個非常重要,nhibernate就是通過id來判斷對象的唯一性的.

五、在配置文件中添加配置內容
1.首先在配置文件的<configuration>代碼下面添加如下代碼
<configSections>
<section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</configSections>
這一段代碼是必須要的
2.在配置文件的</system.web>代碼下面添加如下代碼
<nhibernate>
<!—連接數據提供者 -->
<add
key="hibernate.connection.provider"
value="NHibernate.Connection.DriverConnectionProvider"
/>
<!—連接數據方言最常用的是MsSql2000Dialect -->
<add
key="hibernate.dialect"
value="NHibernate.Dialect.MsSql2000Dialect"
/>
<!—連接數據驅動類-->
<add
key="hibernate.connection.driver_class"
value="NHibernate.Driver.SqlClientDriver"
/>
<!—連接資料庫-->
<add
key="hibernate.connection.connection_string"
value="Server=yanfa1;initial catalog=nhibernate;User id=sa;password=8626798;"
/>
</nhibernate>

六、實現代碼
首先在文件頭添加代碼
using NHibernate;
using NHibernate.Cfg;
1.添加數據:
雙擊「添加「按鈕
private void ButSave_Click(object sender, System.EventArgs e)
{
mCfg=new Configuration();//創建配置類
mCfg.AddXmlFile (System.Web.HttpContext.Current.Server.MapPath("Userhbm.xml"));//指明映射文件Userhbm.xml
EntityClass vEntity=new EntityClass();
vEntity.Id=TxtId.Text;
vEntity.UserName=TxtName.Text;
vEntity.Password=TxtPassword.Text;
vEntity.EmailAddress=TxtEmail.Text;
ISession vSession= mCfg.BuildSessionFactory().OpenSession();//創建會話工廠, 一般來說應該使用一個單例對象來封裝會話工廠.
ITransaction vTransaction = vSession.BeginTransaction();//創建事物處理
try
{
vSession.Save(vEntity);//向資料庫添加數據
vTransaction.Commit();
Labmessage.Text="OK";
}
catch(Exception ex)
{
vTransaction.Rollback();
Labmessage.Text="Error"+ex.ToString();
}
finally
{
vSession.Close();
}
}

2.刪除數據:
雙擊「刪除「按鈕
private void ButDel_Click(object sender, System.EventArgs e)
{
mCfg=new Configuration();
mCfg.AddXmlFile (System.Web.HttpContext.Current.Server.MapPath("Userhbm.xml"));
ISession vSession= mCfg.BuildSessionFactory().OpenSession();
ITransaction vTransaction = vSession.BeginTransaction();
try
{
EntityClass vEntity=(EntityClass) vSession.Load(typeof(EntityClass),TxtId.Text);//查找數據表中所要記錄
vSession.Delete(vEntity);//向資料庫刪除數據
vTransaction.Commit();
Labmessage.Text="OK";
}
catch(Exception ex)
{
vTransaction.Rollback();
Labmessage.Text="Error";
}
finally
{
vSession.Close();
}
}

3.修改代碼:
雙擊「修改「按鈕
private void ButUpdata_Click(object sender, System.EventArgs e)
{
mCfg=new Configuration();
mCfg.AddXmlFile (System.Web.HttpContext.Current.Server.MapPath("Userhbm.xml"));
ISession vSession= mCfg.BuildSessionFactory().OpenSession();
ITransaction vTransaction = vSession.BeginTransaction();
try
{
EntityClass vEntity=(EntityClass) vSession.Load(typeof(EntityClass),TxtId.Text);
vEntity.UserName=TxtName.Text;
vEntity.Password=TxtPassword.Text;
vEntity.EmailAddress=TxtEmail.Text;
vSession.Update(vEntity); //向資料庫修改數據
vTransaction.Commit();
Labmessage.Text="OK";
}
catch(Exception ex)
{
vTransaction.Rollback();
Labmessage.Text="Error";
}
finally
{
vSession.Close();
}
}

② nhibernate不用xml配置映射,使用attribute怎麼弄

由於在項目中使用了NHibernate來作為ORMapping構建數據訪問層,那麼就必須要配置Object和DataTable的映射。最早的項目中,我們使用了最傳統的XML配置文件的方式編寫映射關系,但是這樣太麻煩,每次修改class和表時都要去修改對應的XML文件,而且還容易出錯,一定有疏忽遺漏的地方,還不容易找出錯誤,所以在第二個項目中,我們使用了FluentNHibernate的Mapping方式代替XML配置。使用FluentNHibernate的最大好處是降低了出錯的機會,因為FluentNhibernate的配置是使用C#來編寫,可以智能感知,而且還能編譯,不像原始的XML配置,寫錯了都不知道。:ClassMap{publicConfigMapping(){Table("CONFIG");Id(x=>x.Id,"CONFIG_ID").GeneratedBy.HiLo("1000000000");Map(x=>x.ConfigKey,"CONFIG_KEY");Map(x=>x.ConfigValue,"CONFIG_VALUE");}}但是使用FluentNHibernate的配置方式仍然是需要編寫Mapping代碼的,也就意味著,如果我更改class或者DataTable的時候,還要對應的更改該Mapping文件。的修改意味著的風險,為了減少這方面的風險,同時為了減少配置的工作量,所以在最新的項目中採用了FluentNHibernate中的Automapping。我們只需要定義好映射的規則,就可以不對每個表和類分別編寫映射配置,而是按照規則進行自動的Mapping工作。這樣在修改class或者DataTable時,只需要修改類和表即可,不需要再修改配置文件。要做到Automapping,就一定要定義好嚴格的命名規范,然後按照規范編寫Automapping規則,實現自動化的映射。比如我們可以定義如下的規則:類名和欄位名採用每個單詞首字母大寫的方式而資料庫表名和列名使用全部大寫,單詞之間下劃線分割的方式。(比如CostCenter類對應表COST_CENTER)類中的主鍵使用Id命名,表中的主鍵使用表名+「_ID」的命名方式。(比如CostCenter中有publicvirtuallongId{get;set;},對應表中的列COST_CENTER_ID)對於一對多的關系,使用父方的類名作為屬性名,表中使用父表的主鍵列名作為對應的外鍵列的列名。(比如一個班對應多個學生,在Class類中就有publicvirtualIListStudents{get;set;},而在Student類中就必須使用Class作為屬性名:publicvirtualClassClass{get;set;})對於SubClass,採用將多個子對象都存在同一個表中的方式實現,使用「TYPE」列作為DiscriminatorColumn,使用之類的類名作為子類的唯一標識。對於多對多的關系,把兩個類對應的表名進行排序,將小的排前面,然後將兩個表名連接起來,中間使用「_」分割。(比如Course和Student是多對多關系,那麼產生的中間表表名為COURSE_STUDENT)對於枚舉,在資料庫中使用tinyint也就是一個Byte來存儲,枚舉在Automapping中作為UserType進行處理。下面就來編寫Automapping的轉換規則,首先對String寫一個擴展方法,實現CostCenter到COST_CENTER的轉換:staticstringToDatabaseName(thisstrings){returnRegex.Replace(s,@"\B[A-Z]",match=>"_"+match.ToString()).ToUpper();}對於1,需要實現IClassConvention實現如下::IClassConvention{publicvirtualvoidApply(IClassInstanceinstance){vartableName=instance.EntityType.Name.ToDatabaseName();instance.Table(tableName);}}同時對於列,需要使用IPropertyConvention介面,實現如下:publicclassPropertyConvention:IPropertyConvention{publicvoidApply(IPropertyInstanceinstance){instance.Column(instance.Name.ToDatabaseName());}}對於2,需要實現IIdConvention介面,另外我們採用的是Hilo值的主鍵生成方式,使用一個表HIBERNATE_UNIQUE_KEY存儲每個表的流水。具體實現如下::IIdConvention{="VALUE";="HIBERNATE_UNIQUE_KEY";="TABLE_NAME";publicvirtualvoidApply(IIdentityInstanceinstance){vartableName=instance.EntityType.Name.ToDatabaseName();instance.Column(tableName+"_ID");//這里設置主鍵的命名為表名+「_ID」if(instance.Type==typeof(long))//接下來設置主鍵的生成方式為HiLo值方式{instance.GeneratedBy.HiLo(,NextHiValueColumnName,"1000000000",builder=>builder.AddParam("where",string.Format("{0}='{1}'",TableColumnName,tableName)));}}}對於3,一對多的情況,需要設置「一」的一方的Collection和「多」的一方的Reference,具體如下::ICollectionConvention{publicvoidApply(ICollectionInstanceinstance){stringcolName;varentityType=instance.EntityType;varchildType=instance.ChildType;if(entityType==childType)//這里是專門對自身關聯一對多的情況進行特殊處理,統一使用PARENT_ID作為外鍵列colName="PARENT_ID";else{colName=entityType.Name.ToDatabaseName()+"_ID";}instance.Key.Column(colName);instance.Cascade.AllDeleteOrphan();}}:IReferenceConvention{publicvoidApply(IManyToOneInstanceinstance){stringcolName=null;varreferenceType=instance.Class.GetUnderlyingSystemType();varentityType=instance.EntityType;varpropertyName=instance.Property.Name;//Selfassociationif(referenceType==entityType)colName="PARENT_ID";elsecolName=propertyName.ToDatabaseName()+"_ID";instance.Column(colName);}}對於4SubClass的處理,需要涉及到指定要進行Discriminate的類,還有DiscriminateColumn,然後指定DiscriminateColumn中如何對Subclass進行Mapping。這里就需要重寫類,在該類中指定主鍵、Discriminate的類等,具體代碼如下::{publicoverrideboolShouldMap(Typetype){return(type.IsClass&&type.Namespace.StartsWith("OurProject.Core.Model"));//指定了哪些類是要進行AutoMapping的}publicoverrideboolIsId(Membermember){returnmember.Name=="Id";//指定了每個類中的Id屬性就是該類的主鍵}(Typetype)//指定了哪些類是需要進行SubClass繼承,將其SubClass都存放在一個表中的。{returntype.In(typeof(Client),typeof(Classification),typeof(MultiClassification));}(Typetype){return"TYPE";//指定了SubClass的區分列就是有一個叫做TYPE的列}}然後就是關於DiscriminateColumn中的值如何映射成對應的Subclass,需要實現ISubclassConvention介面,代碼如下:publicclassSubclassConvention:ISubclassConvention{publicvoidApply(ISubclassInstanceinstance){instance.DiscriminatorValue(instance.EntityType.Name);}}對於5多對多,就需要實現IHasManyToManyConvention介面,在這個介面中對兩個表名進行排序,然後進行連接表示中間表。具體代碼如下::IHasManyToManyConvention{publicvoidApply(){varentityDatabaseName=instance.EntityType.Name.ToDatabaseName();varchildDatabaseName=instance.ChildType.Name.ToDatabaseName();varname=GetTableName(entityDatabaseName,childDatabaseName);//對兩個表名進行排序,然後連接組成中間表名instance.Table(name);instance.Key.Column(entityDatabaseName+"_ID");instance.Relationship.Column(childDatabaseName+"_ID");}privatestringGetTableName(stringa,stringb){varr=System.String.CompareOrdinal(a,b);if(r>0){return"{0}_{1}".Fill(b,a);}else{return"{0}_{1}".Fill(a,b);}}}對於6枚舉的處理,需要指定枚舉為UserType,實現介面IUserTypeConvention,具體代碼如下:publicclassEnumConvention:IUserTypeConvention{publicvoidAccept(IAcceptanceCriteriacriteria){criteria.Expect(x=>x.Property.PropertyType.IsEnum);}publicvoidApply(IPropertyInstanceinstance){instance.CustomType(instance.Property.PropertyType);}}實現了以上這幾個介面,那麼大部分情況下的Automapping都可以實現了。最後是將這些介面通知給FluentNhibernate,讓其應用這些介面,導入指定Assembly中的DomainModel,具體的實現方法是:(string[]domainAssemblies,string[]dalAssemblies){varmappings=AutoMap.Assemblies(newAutoMapConfiguration(),domainAssemblies.Select(Assembly.LoadFrom).ToArray());foreach(){mappings.IgnoreBase(ignoredBaseType);}foreach(){mappings.IncludeBase(includeBaseType);}mappings.Conventions.Setup(GetConventions());//指定了Automapping轉換的介面實現foreach(vardalAssemblyindalAssemblies){mappings.UseOverridesFromAssembly(Assembly.LoadFrom(dalAssembly));}returnmappings;}=newList//這里列出的類都是些Base類,不會Mapping到具體某個表{typeof(Entity)//該對象其實就只有Id這個屬性,作為所有要Mapping的類的父類};=newList//默認情況下抽象類是不會Mapping成表的,所以這里需要指明這些類是要Mapping成表的{typeof(Classification),typeof(MultiClassification),typeof(Client)};protectedActionGetConventions(){returnfinder=>{finder.Add();finder.Add();finder.Add();finder.Add();finder.Add();finder.Add();finder.Add();finder.Add();finder.Add();finder.Add();};}該方法返回了一個AutoPersistenceModel,使用這個對象注冊到NHibernate中即可。

③ 怎麼將double屬性欄位設置為非空 hibernate的映射文件

1、Hibernate中映射關系文件中,每個欄位的配置都
需要通過type來指定轉換的類型,這個類型可以
java類型,也可以是Hibernate預置的類型。
2、Java類型
--需要寫完整的類路徑
--對於布爾值的轉換,沒有默認的Java類型可以
處理,如果一定要使用Java類型來處理,需要
自定義一個類,並實現介面UserType
3、Hibernate預置的映射類型(推薦)
1)整數
byte,short,integer,long
2)小數
float,double
3)字元串
string
4)日期(年月日)
date,可以將資料庫中的日期類型轉換為
java.sql.Date
5)時間(時分秒)
time,可以將資料庫中的日期類型轉換為
java.sql.Time
6)時間戳(年月日時分秒)
timestamp,可以將資料庫中的日期類型轉換為
java.sql.Timestamp
7)布爾
yes_no:
可以將資料庫中的y/n轉換為java.lang.Boolean
中的true/false
true_false:
可以將資料庫中的t/f轉換為java.lang.Boolean
中的true/false

④ nhibernate 實體類跟映射欄位不一致可以嗎

是這樣的,你分別生成了dojo類和對應名字的.xml還需要在hibernate.xml這個配置文件裡面進行對應關系的配置而一開始提到的dojo類的xml裡面已經寫明了和資料庫表的實際對應關系那個xml實際上就是用來聲明,你的dojo類怎麼和資料庫表結構對應的如果你用jpa注釋的話,xml都不需要了,直接寫dojo類就可以了

⑤ Nhibernate映射時blob對應是什麼類型

海峰子

⑥ Nhibernate 中 XML 映射文件必須有主鍵嗎

不一定吧。http://nhforge.org/doc/nh/en/index.html官方文檔上的說明:
4.1.3. Provide an identifier property (optional)
.....
The identifier property is optional.
That's more, some functionality is available only to classes which declare an identifier property:
Cascaded updates (see "Lifecycle Objects")
ISession.SaveOrUpdate()
e recommend you declare consistently-named identifier properties on persistent classes.

⑦ Nhibernate怎麼根據實體類和映射文件 建立資料庫表

在hibernate.cfg.xml中添加:

引用

<properties>
<property name="hibernate.hbm2ddl.auto" value="create" />
</properties>

⑧ hibernate中OR映射文件的生成方法

考試也遇到了這個問題....

⑨ NHibernate中的schema是干什麼用的

關於NHibernate和NHibernate中的schema的問題,你可以參考一下以下文章:

什麼是NHibernate

NHibernate 是一個基於.Net 的針對關系型資料庫的對象持久化類庫。Nhibernate 來源於非常優秀的基於Java的Hibernate 關系型持久化工具

NHibernate 從資料庫底層來持久化你的.Net 對象到關系型資料庫。NHibernate 為你處理這些,遠勝於你不得不寫SQL去從資料庫存取對象。你的代碼僅僅和對象關聯,NHibernat 自動產生SQL語句,並確保對象提交到正確的表和欄位中去。

為什麼寫這個指南

任何熟悉Hibernate的人會發現這篇指南和Glen Smith 的 A Hitchhiker』s Guide to Hibernate 非常相近。這里的內容正是基於他的指南,因此所有的感謝都應該給與他。

NHibernate的文檔並非每處都和Hibernate的文檔一致。然而,項目的相似應該能使讀者通過讀Hibernate的文檔來很好的理解NHibernate如何工作。

這篇文檔意在讓你盡可能快的開始使用NHibernate。它將介紹如何持久化一個簡單的對象到一張表裡。想得到更多的復雜的例子,可以參考NUnit測試及附帶代碼。

開發的過程

Nhibernate未來將會提供一些工具幫助你自動產生schema文件(現在還是基於代碼)或是通過映射文件產生類(在籌措階段)或是更新schema(來自於一個新開發者的建議)。然而,這里我們的例子是假定一切來自於完全手寫,包括設置表和.Net類的編寫。我們將進行以下步驟。

1.新建一個將要持久化.Net對象的表

2.構建一個需要被持久化的.Net類

3.構建一個可以讓NHibernate知道如何持久化對象屬性的映射文件

4.構建一個讓NHibernate知道如何連接資料庫的配置文件]

5.使用NHibernate的API

第一步:寫構建表的SQL

這里我們將使用的是一個非常簡單的例子。假設你正在為你的網站開發一個基本的用戶管理子系統。我們將使用如下的一張User表(假定你已經設置好一個資料庫—在的例子里我稱它為NHibernate)。

use NHibernate
go

CREATE TABLE users (
LogonID nvarchar(20) NOT NULL default 』0』,
Name nvarchar(40) default NULL,
Password nvarchar(20) default NULL,
EmailAddress nvarchar(40) default NULL,
LastLogon datetime default NULL,
PRIMARY KEY (LogonID)
)
go
我使用的是MS Sql Server 2000, 但也可以使用任何資料庫,只要你有關於它們的基於.Net數據提供驅動程序。我們將得到一個含有LogonID,Name, Password, Email 和LastLogon的表. 經過以上標准步驟,我們下一步是寫一個.Net類處理一個給定的User對象。

第二步:產生一個.Net 類文件

當內存中有一堆User對象的時候,我們需要某種對象去保存它們。NHibernate通過對象屬性的反射來工作,因此我們需要添加我們希望持久化的對象屬性。一個可以被NHibernate持久化的類應該看起來象下面的樣子:

using System;

namespace NHibernate.Demo.QuickStart
{
public class User
{
private string id;
private string userName;
private string password;
private string emailAddress;
private DateTime lastLogon;

public User()
{
}

public string Id
{
get { return id; }
set { id = value; }
}

public string UserName
{
get { return userName; }
set { userName = value; }
}

public string Password
{
get { return password; }
set { password = value; }
}

public string EmailAddress
{
get { return emailAddress; }
set { emailAddress = value; }
}

public DateTime LastLogon
{
get { return lastLogon; }
set { lastLogon = value; }
}

}
}
在上面的例子里,我們的屬性和構建函數 是public,但這個對NHibernate不是必要的.它可以使用public, protected, internal或者甚至是用private來持久化數據。

第三步:寫映射文件

現在我們有數據表和需要去映射它的.Net類。我們需要一種方式去讓NHibernate知道如何從一個映射到另一個。這個任務依賴於映射文件來完成。最易於管理的辦法是為每一個類寫一個映射文件,如果你命名它是YourObject.hbm.xml 並且把它放在和類的同一個目錄里,NHiberante將會使得事情簡單起來。下面是一個User.hbm.xml的例子:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
<class name="NHibernate.Examples.QuickStart.User, NHibernate.Examples" table="users">
<id name="Id" column="LogonId" type="String" length="20">
<generator class="assigned" />
</id>
<property name="UserName" column= "Name" type="String" length="40"/>
<property name="Password" type="String" length="20"/>
<property name="EmailAddress" type="String" length="40"/>
<property name="LastLogon" type="DateTime"/>
</class>

</hibernate-mapping>

讓我們來看看這個文件中讓我們感興趣的某些行。第一個有趣的標簽是class。這里我們將映射類型名稱(類名和裝配件)到我們資料庫中的User表,這里和Hibernate有一點點的不同。你將不得不告訴NHibernate從何處提取對象。在這個例子里我們從裝配件NHibernate.Examples裝載類NHibernate.Examples.QuickStart.User 。NHibernate 遵循和.Net Framework同樣的規則來載入類型。因此如果你在如何指定類型的方面有些混淆,請參看.Net Framework SDK。

讓我們先跳過id標簽,來討論property標簽。簡要看一下,你將發現NHibernate所要做的工作。name屬性的值正是我們.Net 類的屬性,column屬性值將是我們資料庫里的欄位。type屬性是可選的(如果你不標明,NHibernate將利用反射進行最佳的推測)。

好了,讓我們回到標簽id, 你可以猜測到這個標簽將是映射資料庫表的主鍵,的確如此,id標簽的組成和我們剛才看的property標簽是相似的。我們映射屬性到目標資料庫的欄位。

內嵌的generator 標簽告訴NHibernate 如何生成主鍵(它將恰當的為你生成主鍵,不管你指定何種類型,但你必須告訴它)。在我們的例子里,我們設定為assigned,意味著我們對象將自己生成主鍵(畢竟User對象常常需要一個UserID)。如果你執意要NHiberante為你生成主鍵,你感興趣於設定uuid.hex和uuid.string(從文檔中獲取更多信息)

提示:如果你使用Visual Studio.Net 去編譯的話,請將user.hbm.xml的Build Action屬性設置為Embedded Resource。映射文件將成為裝配件的一部分。更詳細的細節重點將在後面展示。

提示:如果你僅僅是改變映射文件,你不能使用build 而應該Rebuild項目。Visual Studio.Net 不會重新編譯有改變的映射文件。

第四步:為你的資料庫產生一個配置文件

我們至今還沒有告訴NHibernate 去哪裡連接資料庫。最直接的辦法是在你的應用程序的配置文件里設置一個NHibernate配置節。這和在Hibernate里使用屬性文件是等價的。如下配置:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</configSections>

<nhibernate>
<add
key="hibernate.connection.provider"
value="NHibernate.Connection.DriverConnectionProvider"
/>
<add
key="hibernate.dialect"
value="NHibernate.Dialect.MsSql2000Dialect"
/>
<add
key="hibernate.connection.driver_class"
value="NHibernate.Driver.SqlClientDriver"
/>
<add
key="hibernate.connection.connection_string"
value="Server=localhost;initial catalog=nhibernate;Integrated Security=SSPI"
/>
</nhibernate>
</configuration>

上面的例子里用了SqlClient 驅動,在本地連接名稱為NHibernate 的資料庫,提供用戶名和密碼。那裡有一堆屬性你需要調整來確定如何讓NHibernate來訪問資料庫。再次說明,你可以在文檔里獲取更多信息。

請注意以上的配置里並沒有涉及到log4net的配置信息。NHibernate使用log4net來記錄內部發生的一切。在一個應用程序產品里,在你特定環境里,我推薦配置log4net,並為NHibernate設置一定的日誌級別。

第五步:開始展現NHibernate的魔力

所有艱苦的工作已經完成。你將有以下內容

User.cs ----你需要持久化的C#類

User.hbm.xml ----你的NHibernate映射文件

App.config ---對ADO.NET連接的配置信息(如果你願意,你可以在代碼中實現)。
你的資料庫里有一張User表。

現在可以在你的代碼中恰當簡潔的使用NHibernate。簡化的版本如下

創建一個Configuration對象
讓Configuration知道你將存儲何種類型的對象
為你選擇的資料庫創建一個Session對象
Load,Save和Query你的對象
通過Session的Flush()方法將對象提交給資料庫。

為了讓你更清晰,我們來看一些代碼。

首先,創建一個Configuration對象

Configuration對象能夠解析所有.Net對象和後台資料庫中的映射關系。

Configuration cfg = new Configuration();
cfg.AddAssembly("NHibernate.Examples");

Configuration對象會搜索裝配件里的任何以hbm.xml 結尾的文件。還有其他方法載入映射文件,但這種方式是最簡單的。

下一步,創建一個Session對象

ISession對象提供一個到後台資料庫的連接,ITransaction對象提供一個可以被NHibernate管理的事務。

ISessionFactory factory = cfg.BuildSessionFactory();
ISession session = factory.OpenSession();
ITransaction transaction = session.BeginTransaction();
接著來Load, Save和Query你的對象

現在你可以用使用傳統的.Net方法來操縱對象。你想保存一個新對象到資料庫嗎?嘗試下面的方法:

User newUser = new User();
newUser.Id = "joe_cool";
newUser.UserName = "Joseph Cool";
newUser.Password = "abc123";
newUser.EmailAddress = "[email protected]";
newUser.LastLogon = DateTime.Now;

// Tell NHibernate that this object should be saved
session.Save(newUser);

// commit all of the changes to the DB and close the ISession
transaction.Commit();
session.Close();

正如你所看到的,關於NHiberante重要的事情是如此簡單。繼續並且查詢你的資料庫,驗證一下User表裡的新記錄。現在重要的事情就是你去操心業務對象並在進行處理的時候告訴NHibernate就可以了。

讓我們來告訴你,當你有一個UserID的時候如何獲取對象(舉例說,登陸你的網站的時候)。僅僅一句話就可以打開Session,傳入key就可以了

// open another session to retrieve the just inserted user
session = factory.OpenSession();

User joeCool = (User)session.Load(typeof(User), "joe_cool");
你所獲取的User對象還在生存周期內!改變它的屬性,並通過Flush()持久化到資料庫。

// set Joe Cool』s Last Login property
joeCool.LastLogon = DateTime.Now;

// flush the changes from the Session to the Database
session.Flush();

你所要做的就是通過NHibernate來進行你需要的改變,並調用Session的Flush()方法提交。驗證一下資料庫,查查用戶ID為」joe_cool」的記錄中」LastLogon」的更改。

還有更好的,你可以以System.Collections.IList的方式來獲取從表中的對象。如下

IList userList = session.CreateCriteria(typeof(User)).List();
foreach(User user in userList)
{
System.Diagnostics.Debug.WriteLine(user.Id + " last logged in at " + user.LastLogon);
}

這個查詢將會返回所有表記錄。往往你需要做更多的控制,比如說獲取從March 14, 2004 10:00 PM 以後登陸的用戶,如下:

IList recentUsers = session.CreateCriteria(typeof(User))
.Add(Expression.Expression.Gt("LastLogon", new DateTime(2004, 03, 14, 20, 0, 0)))
.List();

foreach(User user in recentUsers)
{
System.Diagnostics.Debug.WriteLine(user.Id + " last logged in at " + user.LastLogon);
}

文檔里還有一堆健壯的查詢方式讓你調用,這里僅僅讓你對NHibernate所提供的強有力的工具有一定的了解。

最後調用Session對象的Close()方法,釋放NHibernate所使用的ADO.Net連接資源

// tell NHibernate to close this Session
session.Close();

更確切地說…

你已經完成創建對象,持久化並通過條件查詢或鍵值查詢來返回它。相信你已經從中獲得快樂。

現在你對NHibernate有了大致的了解,如果你能仔細閱讀大量來自Hibernate 2.0.3文檔,你將獲得幫助(NHibernate文檔還在早期階段,現在還僅僅是對Hibernate的拷貝)。

Enjoy! And Happy NHibernating!

Mike Doerfler

閱讀全文

與映射文件nherbinate相關的資料

熱點內容
考研背單詞什麼app好用 瀏覽:850
usb數據線電源怎麼加 瀏覽:933
主角老婆多的都市小說 瀏覽:920
漲奶後吸奶的小說 瀏覽:677
做數據軟體有哪些 瀏覽:213
48天58天68天 瀏覽:599
午馬電影推薦1001午馬電影推薦 瀏覽:265
數模混合模擬工具 瀏覽:160
在線把pdf文件變小 瀏覽:994
都市言情txt超肉 瀏覽:177
泰國帶女兒打泰電影大全 瀏覽:31
歐美做鴨電影 瀏覽:504
遍歷本地文件內容 瀏覽:610
大數據互聯網測試 瀏覽:233
首營供應商提供哪些資料文件 瀏覽:386
經典風月影視 瀏覽:666
生孩子電影 瀏覽:667
iphone中音樂怎麼刪除 瀏覽:542
關於愛情韓劇電影免費觀看 瀏覽:941
無保qq申訴上保 瀏覽:215

友情鏈接