A fluent interface to NHibernate - Part 2 - Value Objects

In my last post I introduced a new framework which gives you the possibilities to define the mappings of the entities to the underlying database in C# using a fluent interface instead of writing XML mapping files. This has caused some discussion in the community on the pros and cons of this approach.

Let me repeat what the goals of this new framework are or should be

  • reduce friction when mapping entities (and value objects) to the underlying database
  • mapping should be more expressive than use of plain XML
  • mapping should be more testable
  • flexible, that is: allow the use of mapping conventions

How to map common scenarios

Now let's have a look at some common scenarios which you encounter daily in a moderately complex domain model. Let's concentrate on how these scenarios are mapped by using the fluent interface.

Scenario 1: Value Objects

In DDD you have the notion of entities and value objects. The latter are immutable and have no identity. In NHibernate they are mapped as Component and its fields are embedded in the same table as the containing entity.

A typical value object is Money which represents a monetary value. Let's define the following simple domain model

image

We have an account which is an entity and the account contains a property of type Money (called Balance). Balance is now a value object and contains not only the amount but also the currency in which the value is expressed (Note: 100 US$ is different than e.g. 100 €). The code for the money class

public class Money
{
    private Money()
    {
    }
 
    public Money(decimal amount, string currency)
    {
        Amount = amount;
        Currency = currency;
    }
 
    public virtual decimal Amount { get; private set; }
    public virtual string Currency { get; private set; }
}

Note that the properties are read only since any value object is immutable (once set you cannot change it). The private parameter-less constructor is there ONLY to satisfy NHibernate which needs it. But since it is private we cannot accidentally use it.

The code for the Account class is trivial

public class Account : Entity
{
    public virtual string Name { get; set; }
    public virtual Money Balance { get; set; }
}

Note that Account inherits from the Entity base class which is implemented in the framework. As discussed in my previous post I regard this as a limitation of the framework. This requirement possibly will be eliminated in future versions of the framework.

How can we map this scenario? Let's have a look at the necessary code

public class AccountMap : ClassMap<Account>
{
    public AccountMap()
    {
        Id(x => x.Id);
 
        Map(x => x.Name)
            .CanNotBeNull()
            .WithLengthOf(50);
        
        Component<Money>(x => x.Balance, m =>
                                             {
                                                 m.Map(x => x.Amount, "BalanceAmount");
                                                 m.Map(x => x.Currency, "BalanceCurrency");
                                             });
    }
}

Easy, isn't it? First we map the property Id of our account entity (inherited from the base Entity class). Then we map the Name property. We declare that it cannot be null and that it's maximal length should not exceed 50 characters.

Finally we map the Balance property which is a value object an thus treated by NHibernate as Component. Here I have used the second (optional) parameter of the map function which is the name of the table column to which the respective property should be mapped. When we create the database schema from this mapping it will contain one table called Account which contains the four columns Id, Name, BalanceAmount and BalanceCurrency.

Scenario 2: Entity with multiple properties of same value object type

How does this fit for a scenario where I have an entity which has more than one property of the same value object type? Let's have a look at the following simple model. An Employee entity has a HomeAddress and a WorkAddress field. Both fields are of type Address. Address is a value object.

image

Again the code for the Address value object (which is immutable!)

public class Address
{
    public virtual string AddressLine1 { get; private set; }
    public virtual string AddressLine2 { get; private set; }
    public virtual string PostalCode { get; private set; }
    public virtual string City { get; private set; }
    public virtual string Country { get; private set; }
 
    private Address()
    {
    }
 
    public Address(string addressLine1, string addressLine2, string postalCode, string city, string country)
    {
        AddressLine1 = addressLine1;
        AddressLine2 = addressLine2;
        PostalCode = postalCode;
        City = city;
        Country = country;
    }
}

and the Employee entity

public class Employee : Entity
{
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public virtual Address HomeAddress { get; set; }
    public virtual Address WorkAddress { get; set; }
}

Now let's have a look at the mapping code

public class EmployeeMap : ClassMap<Employee>
{
    public EmployeeMap()
    {
        Id(x => x.Id);
        Map(x => x.FirstName).CanNotBeNull().WithLengthOf(20);
        Map(x => x.LastName).CanNotBeNull().WithLengthOf(20);
 
        Component<Address>(x => x.HomeAddress,
                           a =>
                               {
                                   a.Map(x => x.AddressLine1, "Home_AddressLine1");
                                   a.Map(x => x.AddressLine2, "Home_AddressLine2");
                                   a.Map(x => x.PostalCode, "Home_PostalCode");
                                   a.Map(x => x.City, "Home_City");
                                   a.Map(x => x.Country, "Home_Country");
                               });
 
        Component<Address>(x => x.WorkAddress,
                           a =>
                               {
                                   a.Map(x => x.AddressLine1, "Work_AddressLine1");
                                   a.Map(x => x.AddressLine2, "Work_AddressLine2");
                                   a.Map(x => x.PostalCode, "Work_PostalCode");
                                   a.Map(x => x.City, "Work_City");
                                   a.Map(x => x.Country, "Work_Country");
                               });
    }
}

Note that we have to explicitly name the underlying columns here (e.g. "Home_City" versus "Work_City") otherwise the schema generation would fail.

Honestly, I don't like the above code since it is not DRY. So let's refactor it...

public class EmployeeMap : ClassMap<Employee>
{
    private Action<ComponentPart<Address>> MapAddress(string columnPrefix)
    {
        return a =>
                   {
                       a.Map(x => x.AddressLine1, columnPrefix + "AddressLine1");
                       a.Map(x => x.AddressLine2, columnPrefix + "AddressLine2");
                       a.Map(x => x.PostalCode, columnPrefix + "PostalCode");
                       a.Map(x => x.City, columnPrefix + "City");
                       a.Map(x => x.Country, columnPrefix + "Country");
                   };
    }
 
    public EmployeeMap()
    {
        Id(x => x.Id);
        Map(x => x.FirstName).CanNotBeNull().WithLengthOf(20);
        Map(x => x.LastName).CanNotBeNull().WithLengthOf(20);
 
        Component<Address>(x => x.HomeAddress, MapAddress("Home_"));
        Component<Address>(x => x.WorkAddress, MapAddress("Work_"));
    }
}

I have extracted the mapping of the address into a helper method and can now call it as many times as I have to and just have to provide the table column prefix to be used for all fields of the address. What I still don't like in the above approach is that I need an internal helper method to map my addresses. What if I have another entity (say Customer) which also has one or several properties of type Address?

It would be nice if the framework would provide some component mapper.

Since I cannot rely on the framework at the moment I have found the following more elegant solution, where the mapping of the Address value object is externalized into it's own mapper class

public class AddressMap
{
    public static Action<ComponentPart<Address>> WithColumnPrefix(string columnPrefix)
    {
        return a =>
        {
            a.Map(x => x.AddressLine1, columnPrefix + "AddressLine1");
            a.Map(x => x.AddressLine2, columnPrefix + "AddressLine2");
            a.Map(x => x.PostalCode, columnPrefix + "PostalCode");
            a.Map(x => x.City, columnPrefix + "City");
            a.Map(x => x.Country, columnPrefix + "Country");
        };
    }
}

and then the Employee mapper class can be simplified to this

public class EmployeeMap : ClassMap<Employee>
{
    public EmployeeMap()
    {
        Id(x => x.Id);
        Map(x => x.FirstName).CanNotBeNull().WithLengthOf(20);
        Map(x => x.LastName).CanNotBeNull().WithLengthOf(20);
 
        Component(x => x.HomeAddress, AddressMap.WithColumnPrefix("Home_"));
        Component(x => x.WorkAddress, AddressMap.WithColumnPrefix("Work_"));
    }
}

Well, I'm now quite happy with my solution.

Testing the mapping

Now let's write a test for the mapping. A simple test which verifies that the mapping is correct and that a record can be written to the database is quite easy to implement

[TestFixture]
public class Employee_Fixture : FixtureBase
{
    [Test]
    public void Verify_that_employee_saves()
    {
        var emp = new Employee
                      {
                          FirstName = "Gabriel",
                          LastName = "Schenker",
                          HomeAddress = new Address("Castle home", null, "8888", "Paradise", "Switzerland"),
                          WorkAddress = new Address("My work place", null, "7777", "Atlantis", "Pegasus")
                      };
        Session.Save(emp);
 
        Session.Flush();
        Session.Clear();
 
        var fromDb = Session.Get<Employee>(emp.Id);
        Assert.AreNotSame(emp, fromDb);
        Assert.AreEqual(emp.FirstName, fromDb.FirstName);
        Assert.AreEqual(emp.LastName, fromDb.LastName);
        Assert.AreEqual(emp.HomeAddress.AddressLine1, fromDb.HomeAddress.AddressLine1);
        Assert.AreEqual(emp.HomeAddress.AddressLine2, fromDb.HomeAddress.AddressLine2);
        Assert.AreEqual(emp.HomeAddress.PostalCode, fromDb.HomeAddress.PostalCode);
        Assert.AreEqual(emp.HomeAddress.City, fromDb.HomeAddress.City);
        Assert.AreEqual(emp.HomeAddress.Country, fromDb.HomeAddress.Country);
        Assert.AreEqual(emp.WorkAddress.AddressLine1, fromDb.WorkAddress.AddressLine1);
        Assert.AreEqual(emp.WorkAddress.AddressLine2, fromDb.WorkAddress.AddressLine2);
        Assert.AreEqual(emp.WorkAddress.PostalCode, fromDb.WorkAddress.PostalCode);
        Assert.AreEqual(emp.WorkAddress.City, fromDb.WorkAddress.City);
        Assert.AreEqual(emp.WorkAddress.Country, fromDb.WorkAddress.Country);
    }
}
Note that the test fixture inherits from the FixtureBase class which I have described in my previous post. Further note that I use SqlLite as my in-memory database for testing. Let's run the test. Well, it passes as we expected.
But now let's use the framework to help reduce some code. As shown in my previous post we can use the PersistenceSpecification class of the mapping framework for this purpose. A test looks like follows
 
[Test]
public void Verify_that_employee_saves_revisited()
{
    new PersistenceSpecification<Employee>(Session)
        .CheckProperty(x=>x.FirstName, "Gabriel")
        .CheckProperty(x=>x.LastName, "Schenker")
        .CheckProperty(x => x.HomeAddress, new Address("Castle home", null, "8888", "Paradise", "Switzerland"))
        .CheckProperty(x => x.WorkAddress, new Address("My work place", null, "7777", "Atlantis", "Pegasus"))
        .VerifyTheMappings();
}
Let's run this test. Ooops, the result of the test is red! See chapter Update below!

image

The problem is that SqlLite is local to a session. That is, whenever I open a new session I have another (in-memory) database. And since the actual implementation of the PersistenceSpecification class uses a new session to test we have the problem that we now don't have access to the original schema prepared for the test.

So, what can we do? Ok, once again we have to fix the PersistenceSpecification and implement a constructor which takes an existing open session to execute the test.

The problematic code of the PersistenceSpecification class is here

image

I tried to fix it, but a quick and dirty solution didn't work. There has to be done some major re-factoring...

Update (15. Aug. 2008)

The contributors to the framework have worked hard. They changed the implementation of the PersistenceSpecification class such as that it now works also with the SqLite in-memory database. The above test is now working as it should.

Source Code

You can get the source code of the solution accompanying this post here.

Summary

In this post I discussed the mapping of complex entities having one to many properties which are value objects. I have shown that a mapping is possible with the current release of the mapping framework. The PersistenceSpecification class of the framework which should decrease the work to do for testing does not currently work with a SqlLite in-memory database. The PersistenceSpecification class of the framework which decreases the work to do for testing now works also with the SqLite in-memory database.

Enjoy

Blog Signature Gabriel .

Print | posted on Wednesday, August 13, 2008 11:04 AM

Comments on this post

# re: A fluent interface to NHibernate - Part 2 - Value Objects

Requesting Gravatar...
Rev 51 committed. PersistenceSpecification now uses the same session (with a Flush+Clear in the middle).
Left by Chad Myers on Aug 14, 2008 3:48 PM

# re: A fluent interface to NHibernate - Part 2 - Value Objects

Requesting Gravatar...
@Chad: thanks. Will update this post shortly!
Left by Gabriel Schenker on Aug 15, 2008 1:48 AM

# re: A fluent interface to NHibernate - Part 2 - Value Objects

Requesting Gravatar...
Wooww. This looks so cool. I'll definitely be wanting more =p~

Very nice. Please post some more :D

Kudos
Left by Mihai on Aug 18, 2008 7:59 AM

# re: A fluent interface to NHibernate - Part 2 - Value Objects

Requesting Gravatar...
@Mihai: note that part 3 is already posted and further parts will follow soon!
Left by Gabriel Schenker on Aug 18, 2008 9:58 PM

# re: A fluent interface to NHibernate - Part 2 - Value Objects

Requesting Gravatar...
Hi Gabriel,

When running the tests in your solution, I get errors with SQLite:
Could not create the driver from NHibernate.Driver.SQLite20Driver.
The IDbCommand and IDbConnection implementation in the assembly System.Data.SQLite could not be found.

Tried google but couldn't find anything to my aid. Do you know how to fix this?

KR,
Tom
Left by Tom on Oct 20, 2008 7:59 PM

# re: A fluent interface to NHibernate - Part 2 - Value Objects

Requesting Gravatar...
Hello.

Is it me or you're calling a virtual method from within the constructor? I believe that is not the recommended approach. I've just started looking at the code, but it seems like there really isn't any other method which I can overwrite for introducing my definitions...am I wrong?
Left by Luis Abreu on Oct 20, 2008 10:13 PM

# re: A fluent interface to NHibernate - Part 2 - Value Objects

Requesting Gravatar...
@Tom: did you select "copy always" as option for "copy to output directory" for the System.Data.Sqlite assembly? Obviously the file is not found in the bin directory when the code is executed...
eventually you could have a problem with R# (are you using it?). Just tell R# not to use shadowed assemblies during test
Left by nhibernate on Oct 21, 2008 7:13 PM

# re: A fluent interface to NHibernate - Part 2 - Value Objects

Requesting Gravatar...
@Luis: the problem is, that NHibernate forces me to use virtual methods. But it's no problem here. It's just a hint of R# (a guideline) which you can ignore in THIS case.
Left by nhibernate on Oct 21, 2008 7:16 PM

# re: A fluent interface to NHibernate - Part 2 - Value Objects

Requesting Gravatar...
"copy always" as option for "copy to output directory" is selected for the dbfile. On the reference it's just "copy local" "true".

Yes, I'm using r# and I have disabled "shadow-copy assemblies being tested" but that made no difference.
Left by Tom on Oct 22, 2008 12:38 AM

# re: A fluent interface to NHibernate - Part 2 - Value Objects

Requesting Gravatar...
Hi Gabriel,
THX THX THX! One of the best postings i've ever read about nhibernate and doing good sw-architecture :-)

g
Helmut
Left by zyko on Jan 07, 2009 10:35 PM

# re: A fluent interface to NHibernate - Part 2 - Value Objects

Requesting Gravatar...
I get errors with SQLite:
Could not create the driver from NHibernate.Driver.SQLite20Driver.
The IDbCommand and IDbConnection implementation in the assembly System.Data.SQLite could not be found.
Left by club penguin on Jun 02, 2009 7:30 PM

# re: A fluent interface to NHibernate - Part 2 - Value Objects

Requesting Gravatar...
Nice post,
I get errors with SQLite:
Could not create the driver from NHibernate.Driver.SQLite20Driver.
The IDbCommand and IDbConnection implementation in the assembly System.Data.SQLite could not be found.
I cannot find the solution any where

Thanks for writing about it
Left by software development company on Aug 19, 2009 5:41 AM

# re: A fluent interface to NHibernate - Part 2 - Value Objects

Requesting Gravatar...
I get errors with SQLite:
Could not create the driver from NHibernate.Driver.SQLite20Driver.
The IDbCommand and IDbConnection implementation in the assembly System.Data.SQLite could not be found.
Left by luxury Car seats on Oct 29, 2009 3:40 AM

# re: A fluent interface to NHibernate - Part 2 - Value Objects

Requesting Gravatar...
You're right, this makes mapping so much easier!
Left by Kids Games on Nov 23, 2009 11:11 AM

# re: A fluent interface to NHibernate - Part 2 - Value Objects

Requesting Gravatar...
It is better have your blog at hand than just searching on the web all the time.
Left by students with autism on Dec 03, 2009 1:28 AM

# re: A fluent interface to NHibernate - Part 2 - Value Objects

Requesting Gravatar...
I have web based application which used sql reporting services to generate web based reports. Myapplication has dynamic column reports. Entire application get displayed in a pop window ,hence there is no proble with sql injection. But while I do import to excel or any other format it opens another browser where I found the Sql injection (my sql clause).This can be achieved if there is any fascility to use form post method. If this is possible then please let me know the configuration or any other solution.
Left by online nl casino’s on Dec 17, 2009 11:53 PM

# re: A fluent interface to NHibernate - Part 2 - Value Objects

Requesting Gravatar...
Wooww. This looks so cool. I'll definitely be wanting more =p~

Very nice. Please post some more :D
Left by pandora jewelry on Dec 24, 2009 11:58 PM

# re: A fluent interface to NHibernate - Part 2 - Value Objects

Requesting Gravatar...
Thanks for your useful info, I think it's a good topic
Left by Russell blog on Jan 12, 2010 2:52 PM

# re: A fluent interface to NHibernate - Part 2 - Value Objects

Requesting Gravatar...
thats the way i like it
Left by make money online on Jan 16, 2010 1:19 PM

# re: A fluent interface to NHibernate - Part 2 - Value Objects

Requesting Gravatar...
What's more, a bracelet can also be equipped with different small pandora jewelry and even you can change it according to your mood at any time. Here are some meanings of pendant. Small Plane stands for traveling and adventure ; anchor, stability and hope; your baby's boots, having a lot of babies; small feeding pandora bracelets abundant food; Church means happiness and stability of marriage; dragonfly means riches; Eiffel Tower means travel and exploration; four-leaf clover means fortune; horseshoe means luck; Nest means a happy family; bride shows a happy bride in her coming pandora jewelleryship steering shows calming and confidence; pandora ukcoin pandora beadsshows rich marriage life. Wish bone, dreams being about to come true; pandora charm bracelets, love; one heart shot by an arrow, romantic love; purse, wealth; and heart-shaped lock, true love.olkjkjhyu
Left by pandora jewelry on Jan 28, 2010 6:48 PM

# ghd hair

Requesting Gravatar...
To be under the spotlight of people with beautiful[url=http://www.myghdhairs.com] GHD hair straighters[/url] darning hair has haunted the dream of many MM. Girls, with no exception, wish their beautiful straight hair could add to their beauty greatly. And this has brewed the fashion of the
devices. With it [url=http://www.myghdhairs.com] GHD hair straighterscheap GHD[/url] s sound quality and unique design, it has become the GHD hair straighterspecial preference of many girls' first choices. What the unique characteristics of the
[url=http://www.myghdhairs.com] GHD hair straighters[/url] ?
GHD has been leading the hair fashion for a long time, and has been the ideal choice to the fashion-chasing women all around the world. No doubt, the new brand [url=http://www.myghdhairs.com] GHD hair straighters[/url] has enjoyed the most popularity among all sorts of hair-beauty devices which has been served as the “idol brand” in the market for a long time.
Left by igwg on Feb 02, 2010 6:12 PM

# re: A fluent interface to NHibernate - Part 2 - Value Objects

Left by ugg boot on Feb 08, 2010 7:03 PM

# re: A fluent interface to NHibernate - Part 2 - Value Objects

Requesting Gravatar...
Thanks for sharing. i really appreciate it that you shared with us such a informative post..
chemistry degree | Online Public Administration Degree | Social Science school | fire science school | Performing Arts school
Left by siomy on Feb 09, 2010 10:03 PM

# re: A fluent interface to NHibernate - Part 2 - Value Objects

Left by links of london on Feb 16, 2010 3:31 PM

# re: A fluent interface to NHibernate - Part 2 - Value Objects

Requesting Gravatar...
Different spheres of life consume a lot of time and money, therefore why should you waste free time for term paper essays accomplishing? That's wise to utilize some famous classification essay writing service to order the free term papers from, I opine.
Left by viCHLOE on Feb 18, 2010 4:01 PM

# re: Manage SQL Databases

Requesting Gravatar...
Very cheap, very seductive, to echocardiography. Strongly recommended! ! !
panora jewelry
panora jewelry
panora jewelry
Left by pandora jewelry pzm on Feb 21, 2010 2:47 PM

# re: A fluent interface to NHibernate - Part 2 - Value Objects

Left by cheap picture frames on Feb 22, 2010 5:50 PM

# re: A fluent interface to NHibernate - Part 2 - Value Objects

Left by cheap picture frames on Feb 22, 2010 6:10 PM

# discount Ugg Broome Boots in chestnut leather online sales

Requesting Gravatar...
YS0225A8 Before there was no reason i the world,As now there is!The moncler jackets course of water was my only course,My repetitions oceans' sough and swell ugg adirondack boots!My seasons pleasurable,Before there was no reason in the world,As now there is ugg broome boots!To measure time from sleep I rose to sleep,To measure space I pastured on surprise http://www.edhardy-buy.com/,O meadows of resemblances,I was the grove on whose mosaic floors,The moncler online seeds of otherwise were spent,My gods had many arms,I was the Caesar of unmarshaled grass ugg boots!Faustus in the branches,My first ambitions were my sorrows long!Before there was no reason in the world,As now there is!
Left by discount womens moncler jacket on Feb 24, 2010 10:45 PM

# discount air jordan shoes 23 sales online

Requesting Gravatar...
YS0225A7 when the sun hugs the mon, the sky clses her eyes.when the sun hug the moon the sea quiet her jordans shoes.when the sun hugs the moon,the forest stops her susurrus.when the sun hugs the nike sb dunk high,the desert hodlds her breathe.Thousands of years's waiting is only for this nike acg shoes moment.Never be disappointed.Never give up.It hax been sucha long time.At nike air max 2003 this momentmeet each other in course of time.Do not cry,Moon.I guard you forever.Cause you are in my life,everyting has its meaning.The fascinating Diamond Ring,is the ring i give you,May it give you warm http://www.nikejordanshoes2sell.com/ threduce your tears.Do not cry,Sun,I will be there with you forever/Meeting you has given me precious memeory.The resplendent Baily Beads.is the gem i give you .May i give you cheap air jordan 22 shoes strength, shine in your morning.Meet soon and part soon.It makes peop;e retrospect in spite of lasting a few minutes.A long times waiting is coming.Don't know when the next meeting is .When the sun hugs the Moon. the Moon hugs the sun as well Hugging tightly,regian the lost nicety.
Left by discount nike air max shoes sale on Feb 24, 2010 10:47 PM

# discount air jordan shoes 25 sales online

Requesting Gravatar...
YS0225A6 When you belive,Though hope is frail.It's hard to kil,Who knows what cheap prada shoes miracles,You can achieve,When you belive! Somehow you will,

You will when you belive new nike air max!And in this time of fear, When prayer so often proves in vain, Hope seems like the http://www.nikeaf1jordanshoes.com/summer birds. Too swiftly flown away, And now I am standing wholesale gucci shoes here.My heart's so full I can't explain.Seeking faith and speaking women's nike shox words I never thought I'd say, They don't always happen when you ask authentic air jordan shoes.And it's easy to give in to your fear. But when you're blinded by your pain!
Left by discount mens moncler down coat on Feb 24, 2010 10:49 PM

# discount ed hardy women long sleeve shirts sales online

Requesting Gravatar...
YS0225A5 If you think you are beaten, you are! If you think you dare noted hardy clothing, you don't! If you want to win but think you can't, It's almost a cinch you won't ed hardy hoodies! If you think you'll lose,you're lost! For out of the world we find.Success egins with a fellow's will,It's all in a ed hardy shirts state of mind! Life's battles don't always go.To the stronger and faster ed hardy coats man,But sooner or later the man who wins,Is the man who thinks he can! When You Belive http://www.edfashionclothes.com/,Many night we've prayed!With no proof anyone could hear!In our heart a hopeful moncler online store song,we barely understood!Now we are not afraid !Although we know there's much to fear!We were moving the moncler jackets mountian long,Before we knew we could!There can be miracles!
Left by discount mens moncler down coat on Feb 24, 2010 10:52 PM

# discount christian louboutin sandals online sales

Requesting Gravatar...
YS0226A1 That your heart has been broken,Hear words,I'm here, my child,;And know your christian louboutin uk angel has spoken.For even in the darkest hour,When all of discount louboutin shoes hope seems gone,They'll give you strength to live your life,And desire to go on.And if your faith in Heaven, Should ever fade away,They'll help renew your christian louboutin boots spirit, And help you find your way.Even though you're ever filled with doubt, About the christian louboutin pumps life you live,Know that they are there to give you All that they can give.For you see, the Father sent them,Because to Him, you mean so much,That He sent them just for you,my louboutin sale friend,And your life, they will touch.They will always be here,They will never leave your http://www.christianlouboutinshoestore.com/ side;And upon their strength and guidance,You always may rely.Take comfort in their guidance, Draw strength from up above,And know that their sweet presence,Is God's precious gift of love.
Left by cheap christian louboutin shoes on Feb 25, 2010 3:31 PM

# discount women's ugg elsey boots 5596 sales online

Requesting Gravatar...
YS0226A2 If I were a boy again, I would pratice perseverance more often, and never give up a thing because it was ugg australia boots or inconvenient. If we want light, we must conquer darkness. Perseverance can sometimes equal genius cheap ugg boots in its results. “There are only two creatures,” syas a proverb, “who can surmount the pyramids—the eagle and the snail.” If I were a uggs sale boy again, I would school myself into a habit of http://www.topsnowboots.com/ attention; I would let nothing come between me and the subject in hand. I would remember that a good skater never tries to skate in two ugg cardy boots directions at once. The habit of attention becomes part of our life, if we begain early enough. I often hear cheap gucci shoes grown up people say “ I could not fix my attention on the sermon or ugg coquette book, although I wished to do so” , and the reason is, the habit was not formed in youth.
Left by cheap ugg upside boots 5163 on Feb 25, 2010 3:38 PM

# discount Women's ugg adirondack boots II sales online

Requesting Gravatar...
YS0226A3 Hold fast to dreams.For if dreams d. Life is a broken-winged bird,That ugg australia boots can never fly.Hold fast to dreams. For when dreams go,Life is a barren ugg tall boots field, Frozen only with snow !You never know until you try; And you never try unless you really try ugg cardy boot. You give it your best shot; You do the best you can. And if you have done everything http://www.uggsnowbootsbest.com/! In your power,and still,The truth of the uggs argyle knit matter is! That you haven\'t failed at all.When you reach for your dreams,No matter what ugg boots they may be,You grow from the reaching;You learn from the trying;You win from the doing.
Left by cheap ugg classic cardy boots on Feb 25, 2010 3:46 PM

# discount reebok nfl jerseys online sales

Requesting Gravatar...
YS0226A4 A true friend is someone who reaches for your hand and touches r cheap hockey jerseys heart.There's always going to be people that hurt you,so what you have to do is keep on trusting nfl jerseys and just be more careful about who sport jerseys you trust next time around.Make youself a better person and know who you are discount nba jerseys before you try and know someone else and expect them to know you mlb jerseys on sale.Remember:Whatever happens,happens for a reason.How many people actually have 8 true http://www.nfljerseymlb.com/friends Hardly anyone I know.But some of us have all right friends and good friends.
Left by cheap adiads nba jerseys sale on Feb 25, 2010 3:52 PM

# discount ugg sienna miller boots 5818 sales online

Requesting Gravatar...
YS0226A9 Unwearied still, lover by lover,They padd in the cold,Companionable ugg australia shoes streams or climb the air;Their hearts have not grown old;ugg coquette Passion or conquest, wander where they will, Attend upon them still ugg adirondack boots. But now they drift on the still water, Mysterious, beautiful; Among what http://www.uggboots4buy.com/ rushes will they build, By what lake’s edge or pool,Delight men’s mbt shoes eyes when I awake some day.To find they have flown uggs classic cardy away?Before there was no reason in the world As now there is I was the bough bent easy by a ugg boots bird I was the vague blue-grazing flock The sleeping and invisible!
Left by cheap women's ugg elsey boots on Feb 25, 2010 3:55 PM

# discount mens air jordan shoes 13 online sales

Requesting Gravatar...
YS0226A10 When you are old and gray and full of sleep,And nodding e moncler jackets fire, take down this book! And slowly read jordans sheoes , and dream of the soft look,Your eyes had once, and of their cheap nike shoes shadows deep;How many loved your moments of glad grace,And loved your beauty with nike air force 1 love false or true; But one man loved the pilgrim soul in you,And http://www.onestop-onlineshopping.com/ loved the sorrows of your changing face; And bending down beside the designer clothing glowing bars,Murmur, a little sadly, how love fled.And paced upon the mountains overhead discount air jordan shoes,And hid his face amid a crowd of stars.
Left by cheap nike air max 90 online on Feb 25, 2010 4:02 PM

# discount louis vuitton damier canvas handbags online sales

Requesting Gravatar...
YS0226A11 Surrounding you are angels,They are there to guide your path.If designer purses weaesskn overcomes you,They'll give you strength if you will k. They are your protection.When discount designer bags on sale life seems too hard to bear,And though you feel alone at times, The louis vuitton 2009 angels ... they are there.Their faces may be hidden And their voices you might not hear,But they are ALWAYS with you,Through your laughter or your tears.http://www.handbags4buy.com/ They'll walk along beside you,They'll guide your leather handbags steps along the way, They'll comfort you and hold you,Protect you dior handbags night and day.They'll hold to your hand tightly ,They'll not ever let it go,And they'll gently lead you cheap designer handbagsforward,Taking each step very slow.For even as you slumber,They watch closely over you;They are there beside you. In each and every thing you do.
Left by cheap nike air max 90 online on Feb 25, 2010 4:08 PM

# re: A fluent interface to NHibernate - Part 2 - Value Objects

Requesting Gravatar...

wedding dresses,wedding gowns,bride dresses,bridesmaids dresses,evening dresses,bridal gowns,flower girl dresses
Wedding Gowns
Formal Gowns
Cocktail Gowns
Find the wedding dress designer and wedding dress that's right for you! Browse dresses from
Bridesmaid Gowns
Evening Gowns
View our selection of exquisite, handmade gowns and dresses for your wedding
Wedding Dresses, Wedding Shoes and Wedding Accessories from wedding shop, the UK's finest collection of designer wedding dresses.
Use the wedding dress and
cheap wedding
wedding dresses
wedding shop
fffff
Left by sbb on Feb 27, 2010 10:14 PM

# re: A fluent interface to NHibernate - Part 2 - Value Objects

Left by grape seed extract on Feb 28, 2010 12:29 PM

# re: A fluent interface to NHibernate - Part 2 - Value Objects

Requesting Gravatar...

wedding dresses,wedding gowns,bride dresses,bridesmaids dresses,evening dresses,bridal gowns,flower girl dresses
Wedding Gowns
Formal Gowns
Cocktail Gowns
Find the wedding dress designer and wedding dress that's right for you! Browse dresses from
Bridesmaid Gowns
Evening Gowns
View our selection of exquisite, handmade gowns and dresses for your wedding
Wedding Dresses, Wedding Shoes and Wedding Accessories from wedding shop, the UK's finest collection of designer wedding dresses.
Use the wedding dress and
cheap wedding
wedding dresses
wedding shop


ggggggg
Left by sbb on Mar 02, 2010 8:12 PM

# re: A fluent interface to NHibernate - Part 2 - Value Objects

Requesting Gravatar...
It is better have your blog at hand than just searching on the web all the time.
Left by ucvhost on Mar 06, 2010 2:29 AM

# ugg boots

Requesting Gravatar...


they are very good and useful!!!
ugg outlet
cheap uggs
nike shoes
wholesale watches 9io0
Left by ugg boots on Mar 07, 2010 5:48 PM

# re: A fluent interface to NHibernate - Part 2 - Value Objects

Requesting Gravatar...
It’s hard to find knowledgeable people on this topic, but you sound like you know what you’re talking about! Thanks Don’t stop writing, you’ve given me lots of good info! Youtube to MP4 Converter
Convert PDF to image
2as
Left by powerpoint on Mar 08, 2010 2:28 PM

Your comment:

 (will show your gravatar)
 
Please add 5 and 6 and type the answer here: