Fluent NHibernate Samples on CodePlex
I’ve been using Fluent NHibernate for more then a year now and I am big fan of it.
The were only two things bothering me in FNH for all that 1+ year:
- frequent API changes (which made my fluent mapping and auto mapping blog post pretty quick completely obsolete – not to mention my code :)), but when I saw how polished FNH get in 1.0 version I don’t mind any more – simply beautiful code.
- lack of documentation. Don’t get me wrong – http://groups.google.com/group/fluent-nhibernate was REALLY useful most of the the time but I was allways dreaming about something like the current fluent nhibernate wiki which is simply awesome concentrated amount of useful data.
So, to me there’s no more problems with FNH left (beside a few minor bugs no one cares to answerfix) but in last couple of days I’ve accidentally find out ( here on the fnh mailing list and here on stackoverflow) that a lot of folks would like to see a sample code working with fluent nhibernate 1.0 (beside the wiki etc)
That’s why I decided to loop in some of my time today and create a sample project illustrating on a same example both fluent and auto mapping and that’s how I came with
CodePlex project – Fluent Nhibernate samples
The intention of the project is to initially focus on single sample illustrating all of the major use cases in the ‘real world’ manner and then to slowly grow so the sample would start covering more and more corner cases. Hopefully in a long term it would become a c# solution illustrating in one place all of the major FNH usage aspects.
Project can be found on this location http://fnhsamples.codeplex.com/ together with the source code downloadable as zip or SVN-checkout.
So, in order to start the project and based on the questions I am usually hearing mentioned regarding auto mapping I’ve came up with this simple domain model
So a domain space covers imaginary blog engine where:
- a blog roll is a group of blogs (e.g. codebetter.com),
- a blog contain one or many blog posts where every blog post can have one or many categories
- a blog is owned by a single author which can be regular author (that blog is his primary blog) or guest (where he cross post to this blog)
As you can see in this very simple domain I have cases of:
- References (N – 1 relation) where many Blogs belong to one BlogRoll (in this sample Blog mimics aggregate root)
- HasOne (1 – 1 relation) where author can have only one blog in a blog role and all blog posts of a blog are written by a single author only.
- Component where author has a complex Address value property of a Address type which (due to the fact it is not entity) we would like to map to same DB table as Author.
- Subclass (inheritance)where GuestAuthor and RegularAuthor are children of the abstract Author with each one of them having its own custom properties
- HasMany (1 – N relation) where a blog has one or many blog posts
- ManyToMany (N – N relation) where a post can be tagged with many categories and every category can be used in many posts
- Enumeration – where a post has status enumerated value column
- All entities share the same Entity base class which (contrary to Author entity) is not supposed to be mapped in a separate table
Note: I know that this domain model is far from perfect in modeling sense but that is not the point here. The point here is having a meaningful sample which would be used to showcase all the fluent nhibernate magic.
Here’s how the DB model would look like created using both fluent and auto mappings
As you can see, DB diagram match pretty much the domain model and all that (in case of Auto Mapping) just by utilizing conventions without any manual defined mappings.
For the folks curious to check it out now, go to http://fnhsamples.codeplex.com/ where you can download the source currently containing only auto mapping based solution. I guess, it is so simple that most of us could get it just by looking at the small code base there.
For the rest of the people, my next blog post would present the fluent mapping based solution to get from model to DB diagram and after that auto mapping based solution. In that two blog posts, I would comment “line-by-line” so even people new to fluent nhibernate would (I hope) get it.
After that two blog posts, I would have to switch gears and (finally) spit out couple of things I came out with doing Prism development.
I hope at that moment there would be some suggestions what needs to be added to the sample so the sample would start to grow from its starting trivial size.