欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

NHibernate Step by Step(二) 單表操作

系統 1781 0

NHibernate Step by Step( ) 單表操作

接著第一期,我們繼續。

為了方便學習測試,從今天開始我將使用 MS Test 來進行測試,這樣就避免了在一個 Console 工程里不停地添加、注釋代碼了。

提示:為了在 VS2005IDE 中獲得 NHibernate 配置文件的代碼提示,請將你的 $NHibernate/src/NHibernate 下的 nhibernate-configuration-2.0.xsd nhibernate-mapping-2.0.xsd 拷貝到 /Program Files/Microsoft Visual Studio 8/Xml/Schemas 下,這樣當你編輯配置文件或者映射文件時,你將得到完整的代碼提示。
VS2003請拷貝到/Program Files/Microsoft Visual Studio .NET 2003/Common7/Packages/schemas/xml下。

NHibernat 內部使用 log4net 來進行日志操作,今天我們將在配置文件中添加 log4net 的配置,這樣我們在測試的時候將可以清楚地看到 NHibernate 是如何進行工作的。

應用配置文件修改如下:

<? xmlversion="1.0"encoding="utf-8" ?>
< configuration >
< configSections >
< section name ="nhibernate" type ="System.Configuration.NameValueSectionHandler,System,Version=1.0.5000.0,Culture=neutral,PublicKeyToken=b77a5c561934e089" />
< section name ="log4net" type ="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</ configSections >

< nhibernate >
< add key ="hibernate.connection.provider" value ="NHibernate.Connection.DriverConnectionProvider" />
< add key ="hibernate.connection.driver_class" value ="NHibernate.Driver.SqlClientDriver" />
< add key ="hibernate.connection.connection_string" value ="Server=localhost;InitialCatalog=NHibernate;IntegratedSecurity=SSPI" />
< add key ="hibernate.connection.isolation" value ="ReadCommitted" />
< add key ="hibernate.dialect" value ="NHibernate.Dialect.MsSql2000Dialect" />
< add key ="show_sql" value ="true" />
</ nhibernate >

< log4net >
< appender name ="ConsoleAppender" type ="log4net.Appender.ConsoleAppender" >
< layout type ="log4net.Layout.PatternLayout" >
< conversionPattern value ="%date[%thread]%-5level%logger[%ndc]-%message%newline" />
</ layout >
</ appender >
< root >
< level value ="ALL" />
< appender-ref ref ="ConsoleAppender" />
</ root >

</ log4net >

</ configuration >


請注意添加:

< add key ="show_sql" value ="true" />

關于 log4net 的使用,我們這里不做詳細的講解,有興趣的請參考如下地址:

http://logging.apache.org/log4net/

接著,我們在上次的工程組中添加一個名為 Test1 的測試項目,將其中的不需要的手動測試去掉。請注意:除了 NHibernate/Model 引用外,還需要添加如下 3 個引用:

log4net,System.Data,System.Xml.


修改代碼如下:

using System;
using System.Text;
using System.Collections;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using NHibernate;
using NHibernate.Cfg;
using log4net;
using log4net.Config;
using Test.Model;

namespace Test1
{
/**/ /// <summary>
/// SummarydescriptionforUnitTest1
/// </summary>

[TestClass]
public class UnitTest1
{
static ISessionFactoryfactory;
static ILoglogger;
ISessionsession;

public UnitTest1()
{
}


Additionaltestattributes #region Additionaltestattributes

[ClassInitialize()]
public static void MyClassInitialize(TestContexttestContext)
{
XmlConfigurator.Configure();
logger
= LogManager.GetLogger( typeof (Test1.UnitTest1));
Configurationconfig
= new Configuration().AddAssembly( " Test.Model " );
factory
= config.BuildSessionFactory();
}


[ClassCleanup()]
public static void MyClassCleanup() {}

[TestInitialize()]
public void MyTestInitialize()
{
session
= factory.OpenSession();
}


[TestCleanup()]
public void MyTestCleanup()
{
session.Close();
}


#endregion

}

}

我們在測試的開始對 Configuration/SessionFactory/Log 進行初始化。在每一個 Test 的開始獲取一個新的 session ,每一個 Test 結束后即關閉 session


添加如下一個
Get 測試:

[TestMethod]
public void TestRead()
{
Personperson
= (Person)session.Get( typeof (Person), 1 );
Assert.IsTrue(person.Name
== " JackieChan " );
}


我們在前面曾經插入一條名為“Jackie Chan”的記錄,現在在Test Manager中選中TestRead,運行,ok,Passed!
我們使用了session.Get來獲取記錄,方法如下:

object Get( Type clazz , object id );

很簡單,一目了然。


我們切換到
Test Results 窗口,雙擊測試成功的 TestRead 方法,這時將會有一個詳細的測試結果顯示出來, NHibernate 將使用我們指定的 log4net 來輸出詳細信息,我們仔細觀察:


2006-04-15 13:52:13,000 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - opened session

2006-04-15 13:52:13,015 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - loading [Person#1]

2006-04-15 13:52:13,015 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - attempting to resolve [Person#1]

2006-04-15 13:52:13,015 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - object not resolved in any cache [Test.Model.Person#1]

2006-04-15 13:52:13,015 [AdpaterExeMgrThread1] DEBUG NHibernate.Persister.EntityPersister [(null)] - Materializing entity: Test.Model.Person#1


2006-04-15 13:52:13,078 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.BatcherImpl [(null)] - Opened new IDbCommand, open IDbCommands :1

2006-04-15 13:52:13,078 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.BatcherImpl [(null)] - Building an IDbCommand object for the SqlString: SELECT person0_.id as id0_, person0_.name as name0_ FROM Person person0_ WHERE person0_.id=:id

2006-04-15 13:52:13,093 [AdpaterExeMgrThread1] DEBUG NHibernate.Type.Int32Type [(null)] - binding '1' to parameter: 0

2006-04-15 13:52:13,093 [AdpaterExeMgrThread1] INFO NHibernate.Loader.Loader [(null)] - SELECT person0_.id as id0_, person0_.name as name0_ FROM Person person0_ WHERE person0_.id=@p0

2006-04-15 13:52:13,093 [AdpaterExeMgrThread1] DEBUG NHibernate.SQL [(null)] - SELECT person0_.id as id0_, person0_.name as name0_ FROM Person person0_ WHERE person0_.id=@p0

2006-04-15 13:52:13,093 [AdpaterExeMgrThread1] DEBUG NHibernate.SQL [(null)] - @p0 = '1'


2006-04-15 13:52:13,093 [AdpaterExeMgrThread1] DEBUG NHibernate.Connection.DriverConnectionProvider [(null)] - Obtaining IDbConnection from Driver

2006-04-15 13:52:13,859 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.BatcherImpl [(null)] - Opened Reader, open Readers :1

2006-04-15 13:52:13,859 [AdpaterExeMgrThread1] DEBUG NHibernate.Loader.Loader [(null)] - processing result set

2006-04-15 13:52:13,875 [AdpaterExeMgrThread1] DEBUG NHibernate.Loader.Loader [(null)] - result row: 1

2006-04-15 13:52:13,875 [AdpaterExeMgrThread1] DEBUG NHibernate.Loader.Loader [(null)] - Initializing object from DataReader: 1

2006-04-15 13:52:13,875 [AdpaterExeMgrThread1] DEBUG NHibernate.Loader.Loader [(null)] - Hydrating entity: Test.Model.Person#1

2006-04-15 13:52:13,906 [AdpaterExeMgrThread1] DEBUG NHibernate.Type.StringType [(null)] - returning 'Jackie Chan' as column: name0_

2006-04-15 13:52:13,906 [AdpaterExeMgrThread1] DEBUG NHibernate.Loader.Loader [(null)] - done processing result set (1 rows)

2006-04-15 13:52:13,937 [AdpaterExeMgrThread1] DEBUG NHibernate.Driver.NHybridDataReader [(null)] - running NHybridDataReader.Dispose()

2006-04-15 13:52:13,937 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.BatcherImpl [(null)] - Closed Reader, open Readers :0

2006-04-15 13:52:13,937 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.BatcherImpl [(null)] - Closed IDbCommand, open IDbCommands :0

2006-04-15 13:52:13,937 [AdpaterExeMgrThread1] DEBUG NHibernate.Loader.Loader [(null)] - total objects hydrated: 1

2006-04-15 13:52:13,953 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - resolving associations for: [Test.Model.Person#1]

2006-04-15 13:52:13,953 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - done materializing entity [Test.Model.Person#1]

2006-04-15 13:52:13,953 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - initializing non-lazy collections

2006-04-15 13:52:13,953 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - closing session

2006-04-15 13:52:13,953 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - disconnecting session

2006-04-15 13:52:13,953 [AdpaterExeMgrThread1] DEBUG NHibernate.Connection.ConnectionProvider [(null)] - Closing connection

2006-04-15 13:52:13,968 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - transaction completion

在其中,我們可以發現:


2006-04-15 13:52:13,093 [AdpaterExeMgrThread1] DEBUG NHibernate.SQL [(null)] - SELECT person0_.id as id0_, person0_.name as name0_ FROM Person person0_ WHERE person0_.id=@p0

2006-04-15 13:52:13,093 [AdpaterExeMgrThread1] DEBUG NHibernate.SQL [(null)] - @p0 = '1'


對了,就是這里,
NHibernate 替我們構造了一條 sql 語句,并添加一個參數,然后將我們在代碼中賦的 id 1 來填充,這樣,一條完整的可以執行的 sql 語句產生了。

請注意:在產生 sql 語句的前面, NHibernate 構造了一個 IDBCommand ,然后在 sql 語句產生完全后,獲取連接,通過一個 DataReader 來填充 Persion 對象給我們使用,這就是 NHibernate 替我們做的事,是不是很簡單啊?(真的很簡單嗎??看看源代碼吧!!)

請仔細研究輸出的日志。

如法炮制,我們添加另外 3 Test ,完成單個表的全部 CRUD 操作,如下完整代碼:

[TestMethod]

public void TestCreate()

{

Personperson
= new Person();

person.Name
= " JackieChan " ;



ITransactiontrans
= session.BeginTransaction();

try

{

session.Save(person);

trans.Commit();

Assert.IsTrue(person.Id
> 0 );

}


catch (Exceptionex)

{

trans.Rollback();

Assert.Fail(ex.Message);

}


}




[TestMethod]

public void TestUpdate()

{

Personperson
= (Person)session.Get( typeof (Person), 1 );

person.Name
= " JetLi " ;



ITransactiontrans
= session.BeginTransaction();

try

{

session.Save(person);

trans.Commit();

Assert.IsTrue(person.Name
== " JetLi " );

}


catch (Exceptionex)

{

trans.Rollback();

Assert.Fail(ex.Message);

}


}




[TestMethod]

public void TestRead()

{

Personperson
= (Person)session.Get( typeof (Person), 1 );

Assert.IsTrue(person.Name
== " JackieChan " );

}




[TestMethod]

public void TestDelete()

{

Personperson
= (Person)session.Get( typeof (Person), 1 );



ITransactiontrans
= session.BeginTransaction();

try

{

session.Delete(person);

trans.Commit();

}


catch (Exceptionex)

{

trans.Rollback();

Assert.Fail(ex.Message);

}


}


Delete 的方法如下:

void Delete( object obj );

直接傳入需要 delete 的對象即可。

好了,基本的操作都完成了,是不是很Easy?

好了,這一篇就講這么多,我們下次再接著練習。

Step by Step ,顧名思義,是一步一步來的意思,整個教程我將貫徹這一理念。

任何建議或者批評,請 e abluedog@163.com

NHibernate Step by Step(二) 單表操作


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

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 日韩精品一区二区三区 | 一区二区免费在线观看 | 超碰97人 | 亚洲一区在线播放 | 国产精品久久婷婷六月丁香 | 欧美黑人疯狂性受xxxxx喷水 | 狠狠的干| 富二代精品视频 | 性夜黄a爽影免费看 | 欧美日韩成人在线观看 | 色屁屁www免费看视频影院 | 国产综合在线播放 | 日韩欧美日本 | 二区精品视频 | 污网站在线免费看 | 欧美资源在线观看 | 成人在线免费网站 | 免费一二区 | 中国欧美日韩一区二区三区 | 2019中文字幕视频 | 一区在线视频 | 精品午夜寂寞黄网站在线 | 国产精品美女久久久久aⅴ国产馆 | 国产一区二区视频在线播放 | 56av国产精品久久久久久久 | 成人黄色毛片 | 免费观看呢日本天堂视频 | 久草 在线 | 888奇米影视 | 九九综合九九 | 亚洲综合精品 | 亚洲线精品一区二区三区 | 欧美日韩一区二区三区视频播 | 天堂中文资源在线观看 | 欧美精品一区二区三区久久 | 欧美日韩在线观看视频 | 久久中文字幕2021精品 | 国产精品久久久久久久久久久久久 | 中文字幕在线电影观看 | 国产欧美日韩第一页 | 日本阿v视频高清在线 |