using DomainMapping.Mappings;
using NHibernate.Cfg;
using System.Linq;
using System.Collections.Generic;
namespace DomainMapping
{
public static class Mapper
{
static NHibernate.ISessionFactory _sessionFactory = Mapper.BuildSessionFactory();
// call this on production
public static NHibernate.ISessionFactory SessionFactory
{
get { return _sessionFactory; }
}
// Call this on unit testing, so we can test caching on each test method independently
public static NHibernate.ISessionFactory BuildSessionFactory(bool useUnitTest = false)
{
var mapper = new NHibernate.Mapping.ByCode.ModelMapper();
mapper.AddMappings
(
typeof(Mapper).Assembly.GetTypes()
.Where( x => x.BaseType.IsGenericType
&& x.BaseType.GetGenericTypeDefinition()==typeof(NHibernate.Mapping.ByCode.Conformist.ClassMapping<>))
);
// Or you can manually add the mappings
// mapper.AddMappings(new[]
// {
// typeof(PersonMapping)
// });
var cfg = new NHibernate.Cfg.Configuration();
// .DatabaseIntegration! Y U EXTENSION METHOD?
cfg.DataBaseIntegration(c =>
{
var cs = System.Configuration.ConfigurationManager.ConnectionStrings["TheJunBetConnection"].ConnectionString;
// SQL Server
c.Driver<NHibernate.Driver.SqlClientDriver>();
c.Dialect<NHibernate.Dialect.MsSql2008Dialect>();
c.ConnectionString = "Server=localhost;Database=TestTheDatabase;Trusted_Connection=True;MultipleActiveResultSets=True";
// // PostgreSQL
// c.Driver<NHibernate.Driver.NpgsqlDriver>();
// c.Dialect<NHibernate.Dialect.PostgreSQLDialect>();
// c.ConnectionString = "Server=localhost; Database=test_the_database; User=postgres; password=opensesame";
if (useUnitTest)
{
c.LogSqlInConsole = true;
c.LogFormattedSql = true;
}
});
var domainMapping = mapper.CompileMappingForAllExplicitlyAddedEntities();
// // AsString is an extension method from NHibernate.Mapping.ByCode:
// string mappingXml = domainMapping.AsString();
// // Life without Resharper.
// string mappingXml = NHibernate.Mapping.ByCode.MappingsExtensions.AsString(domainMapping);
// System.Console.WriteLine(mappingXml);
cfg.AddMapping(domainMapping);
// http://www.ienablemuch.com/2013/06/multilingual-and-caching-on-nhibernate.html
//var filterDef = new NHibernate.Engine.FilterDefinition("lf", /*default condition*/ null,
// new Dictionary<string, NHibernate.Type.IType>
// {
// { "LanguageCultureCode", NHibernate.NHibernateUtil.String}
// }, useManyToOne: false);
//cfg.AddFilterDefinition(filterDef);
cfg.Cache(x =>
{
// SysCache is not stable on unit testing
if (!useUnitTest)
{
x.Provider<NHibernate.Caches.SysCache.SysCacheProvider>();
// I don't know why SysCacheProvider is not stable on simultaneous unit testing,
// might be SysCacheProvider is just giving one session factory, so simultaneous test see each other caches
// This solution doesn't work: http://stackoverflow.com/questions/700043/mstest-executing-all-my-tests-simultaneously-breaks-tests-what-to-do
}
else
{
// This is more stable in unit testing
x.Provider<NHibernate.Cache.HashtableCacheProvider>();
}
// http://stackoverflow.com/questions/2365234/how-does-query-caching-improves-performance-in-nhibernate
// Need to be explicitly turned on so the .Cacheable directive on Linq will work:
x.UseQueryCache = true;
});
if (useUnitTest)
cfg.SetInterceptor(new NHSqlInterceptor());
var sf = cfg.BuildSessionFactory();
//using (var file = new System.IO.FileStream(@"c:\x\ddl.txt",
// System.IO.FileMode.Create,
// System.IO.FileAccess.ReadWrite))
//using (var sw = new System.IO.StreamWriter(file))
//{
// new NHibernate.Tool.hbm2ddl.SchemaUpdate(cfg)
// .Execute(scriptAction: sw.Write, doUpdate: false);
//}
return sf;
}
class NHSqlInterceptor : NHibernate.EmptyInterceptor
{
// http://stackoverflow.com/questions/2134565/how-to-configure-fluent-nhibernate-to-output-queries-to-trace-or-debug-instead-o
public override NHibernate.SqlCommand.SqlString OnPrepareStatement(NHibernate.SqlCommand.SqlString sql)
{
Mapper.NHibernateSQL = sql.ToString();
return sql;
}
}
public static string NHibernateSQL { get; set; }
} // Mapper
}
Happy Coding!