using System; using System.Collections.Generic; using System.Linq; using NHibernate; using FluentNHibernate.Cfg; using FluentNHibernate.Cfg.Db; using FluentNHibernate.Automapping; using FluentNHibernate.Conventions; using FluentNHibernate.Conventions.Instances; using NHibernateFetchProblems.Models; namespace NHibernateFetchProblems.DbMapping { public static class NhMapping { private static ISessionFactory _isf = null; public static ISessionFactory GetSessionFactory() { if (_isf != null) return _isf; var cfg = new StoreConfiguration(); var sessionFactory = Fluently.Configure() .Database(MsSqlConfiguration.MsSql2008.ShowSql().ConnectionString( "Server=localhost; Database=NhFetch; Trusted_Connection=true; MultipleActiveResultSets=true" )) .Mappings(m => m.AutoMappings .Add(AutoMap.AssemblyOf<Person>(cfg) .Conventions.Add<ReferenceConvention>() .Conventions.Add<HasManyConvention>() .Override<Question>(x => x.HasMany(y => y.QuestionComments).KeyColumn("Question_QuestionId").Cascade.AllDeleteOrphan().Inverse()) .Override<Question>(x => x.HasMany(y => y.Answers).KeyColumn("Question_QuestionId").Cascade.AllDeleteOrphan().Inverse()) .Override<Answer>(x => x.HasMany(y => y.AnswerComments).KeyColumn("Answer_AnswerId").Cascade.AllDeleteOrphan().Inverse()) ) ) .BuildSessionFactory(); _isf = sessionFactory; return _isf; } } public class StoreConfiguration : DefaultAutomappingConfiguration { readonly IList<Type> _objectsToMap = new List<Type>() { // whitelisted objects to map typeof(Person), typeof(Question), typeof(QuestionComment), typeof(Answer), typeof(AnswerComment) }; public override bool IsId(FluentNHibernate.Member member) { // return base.IsId(member); return member.Name == member.DeclaringType.Name + "Id"; } public override bool ShouldMap(Type type) { return _objectsToMap.Any(x => x == type); } } public class ReferenceConvention : IReferenceConvention { public void Apply(IManyToOneInstance instance) { instance.Column( instance.Name + "_" + instance.Property.PropertyType.Name + "Id"); } } class HasManyConvention : IHasManyConvention { public void Apply(IOneToManyCollectionInstance instance) { instance.Inverse(); instance.Cascade.AllDeleteOrphan(); } } }
"Simplicity can't be bought later, it must be earned from the start" -- DB
Sunday, July 17, 2011
Typical Fluent NHibernate Automapping boilerplate code
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment