internal static ISessionFactory BuildSessionFactory(string connectionString, Settings settings) {
var configuration = new Configuration();
configuration.DataBaseIntegration(cfg => {
cfg.ConnectionString = connectionString;
cfg.PrepareCommands = true;
cfg.Driver<SqlClientDriver>();
cfg.Dialect<MsSql2008Dialect>();
cfg.AutoCommentSql = settings.UseDefaultLogger;
cfg.LogFormattedSql = settings.UseDefaultLogger;
cfg.LogSqlInConsole = settings.UseDefaultLogger;
cfg.KeywordsAutoImport = Hbm2DDLKeyWords.AutoQuote;
cfg.BatchSize = 100;
if ( settings.AutoAction == AutoAction.Validate ) {
cfg.SchemaAction = SchemaAutoAction.Validate;
}
});
var mapper = new ModelMapper();
foreach ( var type in settings.Mappings ) {
var instance = CreateMappingInstance(type, settings);
mapper.AddMapping(instance);
}
configuration.AddMapping(mapper.CompileMappingForAllExplicitlyAddedEntities());
if ( settings.UseAssignedGenerator ) {
ChangeGeneratorsToAssigned(configuration, settings.Mappings);
}
if ( settings.UseAllLazy ) {
ChangeAllManyToOneLazy(configuration, settings.Mappings);
}
SchemaMetadataUpdater.QuoteTableAndColumns(configuration, new MsSql2008Dialect());
return configuration.BuildSessionFactory();
}
private static void ChangeGeneratorsToAssigned(Configuration configuration, Type[] mappingTypes) {
foreach ( var mappingType in mappingTypes ) {
var genericType = mappingType.BaseType.GetGenericArguments().First();
if ( configuration.GetClassMapping(genericType).Key is NHibernate.Mapping.SimpleValue keyValue ) {
keyValue.IdentifierGeneratorStrategy = "assigned";
}
}
}
private static void ChangeAllManyToOneLazy(Configuration configuration, Type[] mappingTypes) {
foreach ( var mappingType in mappingTypes ) {
var genericType = mappingType.BaseType.GetGenericArguments().First();
foreach ( var item in configuration.GetClassMapping(genericType).PropertyIterator ) {
if ( item.Value is NHibernate.Mapping.ManyToOne value ) {
value.IsLazy = true;
}
}
}
private static IConformistHoldersProvider CreateMappingInstance(Type type, Settings settings) {
IConformistHoldersProvider holdersProvider;
if ( typeof(ICustomizableMapping).IsAssignableFrom(type) ) {
holdersProvider = Activator.CreateInstance(type, settings) as IConformistHoldersProvider;
}
else {
holdersProvider = Activator.CreateInstance(type) as IConformistHoldersProvider;
}
return holdersProvider;
}