Saturday, May 02, 2009

NHibernate Siri: Macam mana nak start

Aku dah beberapa kali nak tulis tentang Nibernate tapi selalu je tak habis siri tu. Dan kebanyakkan pengunjung yang datang direct dari google search masuk di sini adalah berkaitan NHibernate. Sebenarnya aku kena tulis supaya aku lebih faham dan tak lupa part basic dan untuk kemudian hari senang untuk tengok balik basic tentang NHibernate nie.

Ok untuk bermula basic sekali ialah kena install NHibernate samaada download yang binary atau dari source file dan kemudian compile semula. Aku rasa untuk yang simple download je yang binary.

1. Download NHibernate binary distribution
NHibernate

2. Download NUnit
NUnit

3. Download FluentNHibernate
FluentNHibernate

Ok ready
Install kesemua component/libarary tersebut. Aku akan guna SQL Lite untuk testing persistence object. So tak perlu susah-susah nak setup database SQL Server etc. 3 perkara penting bila test persistence object ialah check save/update atau tidak dalam database, query return seperti dikehendaki dan cascade bila delete.

Ok jika semua dah install ready untuk coding. Open Visual Studio atau Express Edition dan create InMemoryPersistenceTest.cs

public class InMemoryPersistenceTest
{
public ISessionFactory sf = null;
private const string DbFile = "firstProgram.db";

public InMemoryPersistenceTest(string assemblyName)
{
sf = Fluently.Configure()
.Database(SQLiteConfiguration.Standard.UsingFile(DbFile)
.ProxyFactoryFactory("NHibernate.ByteCode.Castle.ProxyFactoryFactory,NHibernate.ByteCode.Castle")
.ShowSql()
)

.Mappings(m => m
.FluentMappings
.AddFromAssembly(Assembly.Load(assemblyName)))
.ExposeConfiguration(BuildSchema)
.BuildSessionFactory();
}

public void BuildSchema(Configuration cfg)
{
if (File.Exists(DbFile))
File.Delete(DbFile);

new SchemaExport(cfg)
.Create(true, true);
}
}


Aku guna FluentNHibernate untuk setting NHibernate configuration. Next step aku create file Person.cs

namespace NHibernateSeries1.Domain
{
public class Person
{
public virtual Guid Id { set; get; }

public virtual string Name { set; get; }
}

public class PersonMap : AutoMap<Person>
{
public PersonMap()
{
WithTable("Person");
Id(x => x.Id).GeneratedBy.Guid();
Map(x => x.Name);
}
}
}


Ok bila dah create domain untuk Person,perlu ada mapping, aku guna facility yang ditawarkan dalam FluentNhibernate untuk buat AutoMap. Masa untuk lakukan testing.

namespace NHibernateSeries1
{
[TestFixture]
public class PersonTest:BaseTest
{
Guid personId;
[Test]
public void SavePerson()
{
using (var s = sf.OpenSession())
using (var tx = s.BeginTransaction())
{
Person p = new Person { Name = "Azam" };
s.Save(p);
personId = p.Id;
tx.Commit();
s.Close();
}

using (var s = sf.OpenSession())
using (var tx = s.BeginTransaction())
{
var p = s.Get<Person>(personId);
Assert.AreEqual("Azam",p.Name);
tx.Commit();
}

}
}
}


Alhamdulillah cukup mudah tanpa setup database pun. Bila run insyAllah dapatlah warna PAS (hijau) ertinya berjaya hehehe

0 comments: