How can I switch all ManyToOne relationships to Lazy

43 views
Skip to first unread message

Oleg M.

unread,
Nov 24, 2019, 7:59:17 PM11/24/19
to nhusers
NHiberante 5.2

I want to switch all ManyToOne relationships to lazy in Session Factory

part ChangeGeneratorsToAssigned work, but ChangeAllManyToOneLazy do nothing

     
   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;
       
}


Oleg M.

unread,
Nov 27, 2019, 2:19:47 PM11/27/19
to nhusers
This code switch all collection mappings to Lazy, but still not workin with ManyToOne

        private static void ChangeAllRelationToLazy(Configuration configuration) {
           
foreach ( var item in configuration.ClassMappings ) {
               
foreach ( var prop in item.PropertyIterator ) {
                   
if ( prop.Value is NHibernate.Mapping.ManyToOne value ) {
                        value
.IsLazy = true;
                   
}
               
}
           
}
           
foreach ( var item in configuration.CollectionMappings ) {
                item
.IsLazy = true;
           
}
       
}


Reply all
Reply to author
Forward
0 new messages