Identity Field, Equality and Hash Code

In this post I'll describe a possible base class for domain entities which implements a surrogate key as identity field and provides equality and hash code.

Introduction

Martin Fowler writes in his PoEAA book: "The identity field saves a database ID field in an object to maintain identity between an in-memory object and a database row."

And further he states: "The first concern is whether to use meaningful or meaningless keys. A meaningful key is something like the U.S. Social Security Number... A meaningless key is essentially a random number the database dreams up that's never intended for human use."

There are many reasons why meaningful keys often are NOT good candidates for an identity field. Primarily they often are not immutable (due to possible human errors) and not unique. Thus Martin Fowler states: "... As a result, meaningful keys should be distrusted. ..."

Having you provided some background about the ongoing dispute about what is a good candidate for an identity field I'll now make my choice. I always choose meaningless keys as identity fields. Such fields are often called surrogate key. Important: "The surrogate key is not derived from application data."

My favorite type of surrogate key is a GUID (global unique identifier). The mathematical algorithm used to generate a new GUID is such as that it is (nearly) impossible to generate the same ID twice (the probability tends to zero).

NHibernate supports GUID as one possible type for the identity field.

Problem Description

When dealing with NHibernate one often uses a special type of collection known as Set. A set is a collection that contains no duplicate elements. More formally, sets contain no pair of elements e1 and e2 such that e1.Equals(e2), and at most one null element. As the Set is not provided by the .NET framework NHibernate uses the IESI collections library which contains an implementation of a set.

In the definition above you find which is the important predicate to decide whether two elements are the same or not. It is the Equals function. By default the Equals function takes the hash code of two objects and compares it. So if two variables e1 and e2 refer to 2 different instances of a class Equals will always return false. But we want to use the identity field as the relevant part in the comparison of two instances. If two different instances have the same identity field then they are equal (that is they refer to the same database record).

Implementation

The default implementation of the Equals function is to be found in the System.Object class. From this class all other classes in .NET implicitly or explicitly inherit. Fortunately the Equals function is virtual and we are able to override it. But when overriding the Equals function we have to also override the GetHashCode function.

Assuming that we take a GUID called Id as identity field we can define the following base class from which all our domain classes directly or indirectly will inherit

public class IdentityFieldProvider<T>
    where T : IdentityFieldProvider<T>
{
    private Guid _id;
 
    public virtual Guid Id
    {
        get { return _id; }
        set { _id = value; }
    }
}

Now lets override the Equals method. A possible solution is

public override bool Equals(object obj)
{
    T other = obj as T;
    if (other == null)
        return false;
 
    // handle the case of comparing two NEW objects
    bool otherIsTransient = Equals(other.Id, Guid.Empty);
    bool thisIsTransient = Equals(Id, Guid.Empty);
    if (otherIsTransient && thisIsTransient)
        return ReferenceEquals(other, this);
 
    return other.Id.Equals(Id);
}

We have to distinguish 3 possible cases. The first one is that the user/developer wants to compare two objects of different type. This case is trivial; the answer is ALWAYS "not equal". The second case is when the two objects are both new (also called transient) then the two references point to the same instance. And the third case just takes the implementation of the Equals method of the GUID type to check for equality.

Now we have to also override the GetHashCode method also inherited from System.Object.

private int? _oldHashCode;
 
public override int GetHashCode()
{
    // Once we have a hash code we'll never change it
    if (_oldHashCode.HasValue)
        return _oldHashCode.Value;
 
    bool thisIsTransient = Equals(Id, Guid.Empty);
    
    // When this instance is transient, we use the base GetHashCode()
    // and remember it, so an instance can NEVER change its hash code.
    if (thisIsTransient)
    {
        _oldHashCode = base.GetHashCode();
        return _oldHashCode.Value;
    }
    return Id.GetHashCode();
}

Now, why this kind of code you might ask yourself? Well, a object should never ever change it's hash code during its life, that is from the moment the object is instantiated until it is disposed. If a object is restored from database there is no problem since any existing database record has always a well defined and unique identity field. Thus we can derive the hash code from this Id field. This is done in the last line of code in the code snippet above.

A little bit more problematic is the case when a new object is created in memory, then it's identity field is undefined (the object has not been saved to the database so far and is thus considered as being transient). In our case undefined means that the Id field has a value of Guid.Empty. In this case we take the default implementation (of System.Object) of the GetHashCode method to generate a hash code. But we store is in an instance variable for further reference.

Later in the life cycle of the instance it may be persisted to the database (but still continues to sit around in the memory). At this moment NHibernate assigns a new unique value to the Id field of the instance. Now the object isn't transient any more but the 2 first lines in the method avoid that the hash code of the object changes. It is still the same object as before. It has just been made persistent.

Finally we can also override the two operators '==' and '!=' to make it possible to compare two instances with those operators instead of only the Equals method.

public static bool operator ==(IdentityFieldProvider<T> x, IdentityFieldProvider<T> y)
{
    return Equals(x, y);
}
 
public static bool operator !=(IdentityFieldProvider<T> x, IdentityFieldProvider<T> y)
{
    return !(x == y);
}

That's it. You can now use this class as the base for every entity class in your domain and never ever have to think about the identity field and the equality of objects. It just happens...

Enjoy

Blog Signature Gabriel

.

Print | posted on Friday, April 04, 2008 2:28 AM

Comments on this post

# re: Identity Field, Equality and Hash Code

Requesting Gravatar...
I am using Hibernate so far (not the N version), but I approached the same problem in a different way - Every entity has a surrogate key (a sequence generated from our oracle db), but it also has its own natural key, which contains one or more immutable properties, that participate in the equals method.
The hashCode method uses a subset of those properties, since the hashcode doesn't have to be unique in the entire system, but just in the set this entity participate in, and sometimes those immutable properties are other entities, and I don't want any lazy loading of other entities just for the sake of hashcode calculation.

That way an object is always equal to "itself" no matter if one instance is transient, and the other is saved. In case a detached client has a set containing a new object, and it persists it, the returned object from the save operation will take the original's place, and I won't have any doubles.
Left by Noam Gal on Apr 04, 2008 6:53 AM

# re: Identity Field, Equality and Hash Code

Requesting Gravatar...
This is very close to the base class I use, however I didn't know that an object's hash code shouldn't change.

Thanks for the tip!
Left by David Newman on Apr 04, 2008 12:38 PM

# re: Identity Field, Equality and Hash Code

Requesting Gravatar...
if you put an object inside a set, then change the hashcode, a call to
set.contains(obj);
will return false, which is obviously not true.
Left by Noam Gal on Apr 04, 2008 9:08 PM

# re: Identity Field, Equality and Hash Code

Requesting Gravatar...
i tried the List<T> type. I found that .Contains() for this type just ignored the changed hash code. why?
Left by jack on Apr 06, 2008 2:39 PM

# re: Identity Field, Equality and Hash Code

Requesting Gravatar...
however, the IESI hashed set is sensible to the hashed code...
Left by jack on Apr 06, 2008 3:24 PM

# re: Identity Field, Equality and Hash Code

Requesting Gravatar...
@jack: a List<T> can contain the very same instance more than once. In a Set an instance must be unique...
Left by Gabriel Schenker on Apr 06, 2008 4:30 PM

# re: Identity Field, Equality and Hash Code

Requesting Gravatar...
@Gabriel: do u mean that, if i use List<T> as my collection type, then it is not necessary to provide these two overrides?
Left by jack on Apr 09, 2008 4:19 AM

# re: Identity Field, Equality and Hash Code

Requesting Gravatar...
@Gabriel: another question, about the operator== implementation provided above, you use Equals(x, y). why not use x.Equals(y)?
Left by jack on Apr 09, 2008 4:21 AM

# re: Identity Field, Equality and Hash Code

Requesting Gravatar...
jack,

> do u mean that, if i use List<T> as my collection type, then it is not necessary to provide these two overrides?

Isn't that a bad argument to not override? Maybe you use it in a set in the future and you encounter strange problems because you didn't override.
List doesn't use GetHashCode but it uses Equals (sort of). The default Equals and GetHashCode look at the instance of a class, not the contents of it.

> another question, about the operator== implementation provided above, you use Equals(x, y). why not use x.Equals(y)?

If x is null an exception is raised. You can check for null before, but it's easier to let object.Equals do that ;) object.Equals(x,y) calls x.Equals if it is not null.
Left by alwin on Apr 17, 2008 1:55 AM

# re: Identity Field, Equality and Hash Code

Requesting Gravatar...
Gabriel, a few comments:

1) You write "By default the Equals function takes the hash code of two objects and compares it". That is not true... it compares the identity of the objects (that they point to the same physical object in mem). Its perfectly legal to have objects which are not equal but gives back the same hashcode... (depending on the hashing algoritm)

2) Your solution doesn't handle the situation where one object is transient - and the other not. Very possible problem...

3) I tend to use a much simpler approach which is 100% failsafe:
I also use Guid's as identity field but marks it as "assigned" in the mapping file. I create and assign a new sequential Guid in the constructor of my entities. This makes my Equals and GetHashcode very simple - they need not check for unassigned id's.
In order for nhibernate to know whether to insert or update I use the "version" mechanism with unsaved-value = negative (and have a version field in my base class set to -1.

<id name="Id">
<generator class="assigned" />
</id>
<version name="Version" unsaved-value="negative"/>

Another plus is that this gives you optimistic-locking functionality out of the box.

Kind regards Carsten
Left by Carsten Hes on Apr 25, 2008 7:39 PM

# re: Identity Field, Equality and Hash Code

Requesting Gravatar...
@Carsten:
1) you are right regarding the Equals function! Microsoft states in the online help: "the Object.Equals method determines whether two Object instances are equal."
2) Either I don't understand your question or you are wrong... sorry
3) You are correct. But I don't want to introduce a version field for every single case even if not explicitely needed. It only complicates the picture. Please keep in mind that these posts all use simplified models to not obscure what I want to point out with to much implementation details. In a real business application though you will always have a more complex model.

Left by Gabriel Schenker on Apr 26, 2008 7:14 AM

# re: Identity Field, Equality and Hash Code

Requesting Gravatar...
@Gabriel

You are right about 2) in my previous post being my bad.

Keep up the good work!
/Carsten
Left by Carsten Hess on May 26, 2008 12:01 AM

# re: Identity Field, Equality and Hash Code

Requesting Gravatar...
Hello.
One question: did you look at Billy's solution based on domain signature?
http://devlicio.us/blogs/billy_mccafferty/archive/2007/04/25/using-equals-gethashcode-effectively.aspx

he has improved this on his demo project which is also available on his site. feedback on these approaches?
Left by Luis Abreu on May 27, 2008 11:08 PM

# re: Identity Field, Equality and Hash Code

Requesting Gravatar...
What is the advantage of going the Generic way IdentityFieldProvider<T> instead of defining a base class (e.g. BaseUniqueIdentifier) that hat a member called Id of type Guid?
Left by Andreas on Sep 01, 2008 9:08 PM

# re: Identity Field, Equality and Hash Code

Requesting Gravatar...
2) Your solution doesn't handle the situation where one object is transient - and the other not. Very possible problem...


If you add an object to the set while it is transient and then persist it, reload it (probably by some different code) and add the reloaded instance to the set, you will have a duplicate in the set. The two instances will be equal but have different hash codes, which is illegal.
Left by Eivind on Nov 13, 2008 8:32 AM

# re: Identity Field, Equality and Hash Code

Requesting Gravatar...
Hmm, I have the feeling your Equals/GetHashCode combination is dangerously wrong.

I quote from the MSDN:
A hash function must have the following properties:

If two objects compare as equal, the GetHashCode method for each object must return the same value. However, if two objects do not compare as equal, the GetHashCode methods for the two object do not have to return different values.

---

Following situation:
transient object gets saved. the id changes from Guid.Empty to the generated guid. Hashcode is still the transient value.
Now load the recently saved object, while still holding a reference to the former transient one. Comparing the two via Equals will return true - though the hashcodes differ, which is a direct violation of the definition in the msdn.

Or am I missing something?
Left by Tobias Hertkorn on Feb 23, 2009 8:24 PM

# re: Identity Field, Equality and Hash Code

Requesting Gravatar...
@Tobias: you have to consider the following:
-create a new object (Id=Guid.Empty, HashCode=x)
-open session and save object (Id=some Guid, Hashcode=x)
-load object again [inside same session] (object is not reloaded from DB since it is in 1st level cache. thus the object is the same...)
please read my article about first- and second level caching. ;-)
Left by Gabriel N. Schenker on Apr 05, 2009 11:57 AM

# re: Identity Field, Equality and Hash Code

Requesting Gravatar...
That way an object is always equal to "itself" no matter if one instance is transient, and the other is saved. In case a detached client has a set containing a new object, and it persists it, the returned object from the save operation will take the original's place, and I won't have any doubles.
Left by pandora jewelry on Dec 24, 2009 11:55 PM

# re: Identity Field, Equality and Hash Code

Requesting Gravatar...
I am using Log4net as logger of my application.
Is there a wait to separe this entries in a different file ?
Thks
Left by virtual casino deal on Jan 07, 2010 6:41 PM

# re: Identity Field, Equality and Hash Code

Requesting Gravatar...
After reading your post.., I remember a song entitled "The way we were" Great post..
Left by Aaron blog on Jan 11, 2010 8:08 PM

# re: Identity Field, Equality and Hash Code

Requesting Gravatar...
i thought the same thing
Left by make money online on Jan 16, 2010 1:11 PM

# re: Identity Field, Equality and Hash Code

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 shows 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.pandora jewellery
Left by kasandra1972 on Jan 29, 2010 12:48 PM

# re: Identity Field, Equality and Hash Code

Requesting Gravatar...
This introduction very helpful for me. Thanks a lot!
Left by back pain relief on Feb 04, 2010 8:28 PM

# re: Identity Field, Equality and Hash Code

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

# re: Identity Field, Equality and Hash Code

Requesting Gravatar...
I agree with s.rottem 2nd point - if you create a new object, save it, disconnect it, and then check for equality with the same object after it was loaded from the db, you should get equality.I think it is much easier to assign a "business key" to every persistent class - it will not be a key in any database sense, and the class should still have some kind of generated id column with no business logic, but a collection of (as few as possible) properties should define equality between two objects of the same class, and be used to calculate hashcode.
Left by slots en ligne on Feb 13, 2010 12:25 AM

# re: Manage SQL Databases

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

# re: Identity Field, Equality and Hash Code

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

# aion gold

Requesting Gravatar...
Do you knowaion gold?if you play the online game,you will knowbuy aion goldis the game gold.you can come here and spend a little money to boughtcheap aion gold.Quickly come here.
Left by aion gold on Feb 24, 2010 1:31 PM

# discount Ugg Broome Boots in chestnut leather online sales

Requesting Gravatar...
YS0225A8 Before there was no reason in 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 Caar 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 11:02 PM

# discount air jordan shoes 23 sales online

Requesting Gravatar...
YS0225A7 when the sun hugs the moon, 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 giveou 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 11:06 PM

# discount air jordan shoes 25 sales online

Requesting Gravatar...
YS0225A6 When you belive,Though hope is frail.It's hard to kill,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 wn 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 11:11 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 begins 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 ow 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 11:14 PM

# discount christian louboutin sandals online sales

Requesting Gravatar...
YS0226A1 That your heart has been broken,Hear the wor,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:32 PM

# discount women's ugg elsey boots 5596 sales online

Requesting Gravatar...
YS0226A2 If I were a boy again, I would pctice 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:39 PM

# discount Women's ugg adirondack boots II sales online

Requesting Gravatar...
YS0226A3 Hold fast to dreams.For if dreams die. ife 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:47 PM

# discount reebok nfl jerseys online sales

Requesting Gravatar...
YS0226A4 A true friend is someone who reaches for your han and touches your 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:51 PM

# discount ugg sienna miller boots 5818 sales online

Requesting Gravatar...
YS0226A9 Unwearied still, lover by lover,They paddle i 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:56 PM

# discount mens air jordan shoes 13 online sales

Requesting Gravatar...
YS0226A10 When you are old and gray and full of sleep,And odding by the 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:01 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 wil ask. 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:07 PM

# re: Identity Field, Equality and Hash Code

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
ewq
Left by sbb on Feb 27, 2010 10:12 PM

# re: Identity Field, Equality and Hash Code

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


tr
Left by sbb on Mar 02, 2010 8:09 PM

# re: Identity Field, Equality and Hash Code

Requesting Gravatar...
This is actually some really good information that I will be able to use thanks!
Left by ucvhost on Mar 06, 2010 2:54 AM

# ugg boots

Requesting Gravatar...


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

# re: Identity Field, Equality and Hash Code

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
qw
Left by powerpoint on Mar 08, 2010 2:20 PM

# re: Identity Field, Equality and Hash Code

Requesting Gravatar...
My hair is just over my ears. I like two kinds of hair styles most. Firstly, use the ghd straighteners to make

the hair in nature and bouffant style. Divide the hair into several portions. Use ghd pink to roll them inside

towards your ears. Several minutes later, the hair will roll neatly inside in the branches. Secondly, the active and energetic style with the roll of the

direction in the opposite direction can be made similarly with the formal procedure. All you need to do is to roll the hair outward instead of inward

with ghd mk5.
It is so simple that you can have your own charming short hair style with GHD straightener uk. Besides the new hair styles,ghd straighteners can help you with the puffy hair after you get up which is the annoying thing for many short hair

girls.
So as long as I have the good tool of ghd pink, no matter what the fashion trend goes of hair styles, I will

stick into my favorite neat short hair.I have bookmark it!hope for your arctical more!
Left by ghd straighteners on Mar 09, 2010 3:37 PM

# re: Identity Field, Equality and Hash Code

Requesting Gravatar...
I was very pleased to find this site.I wanted to thank you for this great read!! I definitely enjoying every little bit of it and I have you bookmarked to check out new stuff you post.
cheap vps | cheap hosting
Thanks
Left by ucvhost on Mar 10, 2010 11:49 PM

# re: Identity Field, Equality and Hash Code

Requesting Gravatar...
I will certainly bookmark it or even subscribe to your rss feeds just to be updated on your new posts
Left by free ringtones on Mar 11, 2010 8:16 AM

# re: Identity Field, Equality and Hash Code

Requesting Gravatar...
Everybody need directions in life and not only directions, but the driving directions. But let me ask you a question: Have you always taken the right decisions? Have you always got the perfect directions? Few years ago mapquest driving directions usa designed a peace plan for Middle East, it was called УThe road mapФ. They were determined to follow it and to bring peace in that troubled area. I donТt know if that plan worked or not, but I know is not peace in that area now mapquest driving directions.
Left by usa mapquest on Mar 11, 2010 8:29 AM

# re: Identity Field, Equality and Hash Code

Requesting Gravatar...
GOOD IDEA
Left by rolex on Mar 11, 2010 1:51 PM

Your comment:

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