Originally posted at 11/18/2010
I got an interesting question today (I am teaching my NHibernate course now).
The tabular structure is similar to this:
But the desired object structure is:
That is quite different than the tabular model, but it is actually very easy to handle this with NHibernate.
Here are the mapping for the Address entity. We use the <join/> tag to have an entity that spans more than a single table:
<class name="Address" table="Addresses"> <id name="Id"> <generator class="identity"/> </id> <property name="City" /> <join table="PeopleAddresses" > <key column="AddressId"/> <property name="IsDefault"/> <property name="ValidFrom"/> <property name="ValidTo"/> </join> </class>
We then map the Person, using standard many-to-many mapping for the addresses:
<class name="Person" table="People"> <id name="Id"> <generator class="identity"/> </id> <property name="Name" /> <bag name="Addresses" table="PeopleAddresses" inverse="true"> <key column="PersonId"/> <many-to-many class="Address" column="AddressId"/> </bag> </class>
There is just one thing thing to be aware of, you can’t add new addresses via the Person.Addresses collection, because the PeopleAddresses table has more data in it than just the keys. Presumably, you are handling this in some other fashion already.
All in all, this is a pretty elegant solution.