I’ve got two tables in my database: Articles and Tags
The Tags tables consist of ArticleID (foreign key) and a Tag (varchar).
Now I need to map an articles tags into a readonly collection on Article entity, either using IList Tags or ReadOnlyCollection Tags.
I’ve consulted the NHibernate reference material, but I can’t seem to figure when to use Set, Bag and the other Nhibernate collections. I’ve seen examples using the ISet collection, but I really don’t like to tie my entity classes to a NHibernate type.
How can I do the mapping in NHibernate?
edit: I ended up using a <bag> instead, as it doesn’t require an index:
<bag name='Tags' table='Tag' access='nosetter.camelcase' lazy='false'> <key column='ArticleId' /> <element column='Tag' type='System.String' /> </bag>
The type of collection to use in your mapping depends on how you want to represent the collection in code. The settings map like so:
<list>maps directly to an IList.<map>maps directly to an IDictionary.<bag>maps to an IList. A does not completely comply with the IList interface because the Add() method is not guaranteed to return the correct index. An object can be added to a<bag>without initializing the IList. Make sure to either hide the IList from the consumers of your API or make it well documented.<set>maps to an Iesi.Collections.ISet. That interface is part of the Iesi.Collections assembly distributed with NHibernate.so if you want an IList to be returned, then you would use the
<list>mapping. In your case, I’d probably map using the<list>mapping.