Beispiel #1
0
        public void Configure(Configuration configuration)
        {
            var autoPersistenceModel = new AutoPersistenceModel(this.autoMappingConfiguration);

            foreach (var conventionType in this.conventionTypes)
            {
                autoPersistenceModel.Conventions.Add(conventionType);
            }

            foreach (var assembly in this.autoMapAssemblies)
            {
                autoPersistenceModel.AddEntityAssembly(assembly);
            }

            foreach (var assembly in this.overrideAssemblies)
            {
                autoPersistenceModel.UseOverridesFromAssembly(assembly);
            }

            foreach (var @override in this.overrides)
            {
                @override(autoPersistenceModel);
            }

            autoPersistenceModel.Configure(configuration);
        }
Beispiel #2
0
        /// <summary> Configure domain mapping </summary>
        public static AutoPersistenceModel ConfigureMapping(Configuration configuration)
        {
            AutoPersistenceModel model = Mapping.CreateMapping();

            model.Configure(configuration);
            return(model);
        }
        protected override void Load(ContainerBuilder builder)
        {
            Contract.Assert(builder != null, "Builder container is null");
            Contract.Assert(!string.IsNullOrEmpty(ConnectionString), "Cannot find connection string in config file");
            Contract.Assert(AssemblyMapper != null, "AssemblyMapper is null");

            Configuration cfg = BuildConfiguration();

            AutoPersistenceModel persistenceModel = BuildPersistenceModel();

            persistenceModel.Configure(cfg);

            SessionFactory = BuildSessionFactory(cfg);

            RegisterConponents(builder, cfg);
        }
        private static Configuration BuildConfiguration(
            string connectionString)
        {
            Configuration configuration = new Configuration();


            AutoPersistenceModel model = AutoMap.AssemblyOf <Entity>();

            model.IgnoreBase <Entity>();
            model.Conventions.Add <TableNameConvention>();
            model.Conventions.Add <IdConvention>();
            model.Conventions.Add <ReferenceConvention>();

#if DEBUG
            try
            {
                // Writes into specific folder
                string folder = Path.Combine(@"c:\MyProjectMapping", "Mapping");
                if (!Directory.Exists(folder))
                {
                    Directory.CreateDirectory(folder);
                }

                model.WriteMappingsTo(folder);
            }
            catch { }
#endif
            model.Configure(configuration);

            if (!string.IsNullOrEmpty(connectionString))
            {
                configuration.SetProperty("connection.connection_string", connectionString);
            }

            return(configuration);
        }
        public static global::NHibernate.Cfg.Configuration CreateConfiguration(SupportedNHDrivers nhDriver, string connectionString, Assembly fluentMappingsAssembly, bool showSql, bool enablePostCommitListener, string sessionContext, bool outputNhMappings, bool useNhProfiler, out NhConfigurationCacheKey configurationCacheKey)
        {
            Mandate.ParameterNotNullOrEmpty(connectionString, "connectionString");
            Mandate.ParameterNotNull(fluentMappingsAssembly, "fluentMappingsAssembly");
            Mandate.ParameterCondition(nhDriver != SupportedNHDrivers.Unknown, "nhDriver");

            configurationCacheKey = new NhConfigurationCacheKey(
                nhDriver,
                connectionString,
                fluentMappingsAssembly,
                showSql,
                enablePostCommitListener,
                sessionContext,
                outputNhMappings);

            return(ConfigurationCache.GetOrAdd(
                       configurationCacheKey,
                       y =>
            {
                using (new WriteLockDisposable(MappingLocker))
                {
                    if (useNhProfiler)
                    {
                        try
                        {
                            NHibernateProfiler.Initialize();
                            NhProfilerLogging.Enabled = true;
                        }
                        catch (InvalidOperationException ex)
                        {
                            //swallow security exceptions, happens if running in Medium trust
                            if (!(ex.InnerException is SecurityException))
                            {
                                throw ex;
                            }
                        }
                    }

                    // Figure out the FluentNH persistence configurer based on the desired driver
                    var persistenceConfigurer = GetPersistenceConfigurer(nhDriver, connectionString);

                    // Configure NH using FluentNH
                    var fluentConfig = Fluently.Configure().Database(persistenceConfigurer)
                                       //.Cache(x =>
                                       //        x.UseMinimalPuts()
                                       //        .UseQueryCache()
                                       //        .UseSecondLevelCache()
                                       //        .ProviderClass(typeof(global::NHibernate.Caches.SysCache2.SysCacheProvider).AssemblyQualifiedName))
                                       .ExposeConfiguration(c => c.SetProperty(Environment.ReleaseConnections, "on_close"))
                                       // after_transaction does not work for unit tests with Sqlite
                                       .ExposeConfiguration(
                        c => c.SetProperty(Environment.CurrentSessionContextClass, sessionContext)).
                                       ExposeConfiguration(c => c.SetProperty(Environment.GenerateStatistics, useNhProfiler.ToString().ToLower())).
                                       ExposeConfiguration(c => c.SetProperty(Environment.BatchSize, "20")).ExposeConfiguration
                                       (
                        c =>
                        c.SetProperty(
                            Environment.ProxyFactoryFactoryClass,
                            typeof(ProxyFactoryFactory).AssemblyQualifiedName)).Mappings(
                        x =>
                    {
                        var container =
                            x.FluentMappings.AddFromAssembly(fluentMappingsAssembly);
                        AddConventions(nhDriver, container.Conventions);
                    });

                    if (showSql)
                    {
                        fluentConfig.ExposeConfiguration(c => c.SetProperty(Environment.ShowSql, "true"));
                    }

                    try
                    {
                        // Generate the NHibernate configuration object from FluentNH
                        var nhConfig = fluentConfig.BuildConfiguration();

                        // Add a PostCommitInsert listener which is responsible for passing generated IDs back to the
                        // mapped entities for entity insert scenarios (since the NH mapped objects aren't passed outside
                        // of this provider)
                        if (enablePostCommitListener)
                        {
                            var entitySaveEventListener = new NhEventListeners();
                            nhConfig.SetListener(ListenerType.PostCommitInsert, entitySaveEventListener);
                            nhConfig.SetListener(ListenerType.Delete, entitySaveEventListener);
                            nhConfig.SetListener(ListenerType.Merge, entitySaveEventListener);
                            nhConfig.SetListener(ListenerType.SaveUpdate, entitySaveEventListener);
                            nhConfig.SetListener(ListenerType.Flush, entitySaveEventListener);
                            nhConfig.SetListener(ListenerType.Evict, entitySaveEventListener);
                        }

                        // Add the FluentNH persistence model and configure NH to use it
                        var fluentAutoModel = new AutoPersistenceModel();

                        fluentAutoModel.AddMappingsFromAssembly(fluentMappingsAssembly);
                        fluentAutoModel.BuildMappings();
                        fluentAutoModel.Configure(nhConfig);

                        if (outputNhMappings)
                        {
                            var codeBase = Assembly.GetExecutingAssembly().CodeBase;
                            var uri = new Uri(codeBase);
                            var path = uri.LocalPath;
                            var binFolder = new DirectoryInfo(Path.GetDirectoryName(path));
                            string nhibernateOutputFolder;
                            if (binFolder.Name == "Debug")
                            {
                                nhibernateOutputFolder = Path.Combine(
                                    binFolder.Parent.Parent.FullName, "App_Data", "Logs", "NHibernateConfig");
                            }
                            else
                            {
                                //its just 'bin'
                                nhibernateOutputFolder = Path.Combine(
                                    binFolder.Parent.FullName, "App_Data", "Logs", "NHibernateConfig");
                            }
                            Directory.CreateDirectory(nhibernateOutputFolder);
                            fluentAutoModel.WriteMappingsTo(nhibernateOutputFolder);
                        }

                        return nhConfig;
                    }
                    catch (Exception ex)
                    {
                        throw new InvalidOperationException("Cannot build NHibernate configuration", ex);
                    }
                }
            }));
        }
Beispiel #6
0
        public static Configuration AddAutoMappings(this Configuration configuration, AutoPersistenceModel model)
        {
            model.Configure(configuration);

            return(configuration);
        }
Beispiel #7
0
        public static Configuration AddAutoMappings(this Configuration configuration, AutoPersistenceModel model)
        {
            model.Configure(configuration);

            return configuration;
        }
Beispiel #8
0
        public static global::NHibernate.Cfg.Configuration CreateConfiguration(SupportedNHDrivers nhDriver, string connectionString, Assembly fluentMappingsAssembly, bool showSql, bool enablePostCommitListener, string sessionContext, bool outputNhMappings, bool useNhProfiler, out NhConfigurationCacheKey configurationCacheKey, string connReleaseMode)
        {
            Mandate.ParameterNotNullOrEmpty(connectionString, "connectionString");
            Mandate.ParameterNotNull(fluentMappingsAssembly, "fluentMappingsAssembly");
            Mandate.ParameterCondition(nhDriver != SupportedNHDrivers.Unknown, "nhDriver");

            configurationCacheKey = new NhConfigurationCacheKey(
                nhDriver,
                connectionString,
                fluentMappingsAssembly,
                showSql,
                enablePostCommitListener,
                sessionContext,
                outputNhMappings);

            return(ConfigurationCache.GetOrAdd(
                       configurationCacheKey,
                       y =>
            {
                using (new WriteLockDisposable(MappingLocker))
                {
                    if (useNhProfiler)
                    {
                        try
                        {
                            NHibernateProfiler.Initialize();
                        }
                        catch (InvalidOperationException ex)
                        {
                            //swallow security exceptions, happens if running in Medium trust
                            if (!(ex.InnerException is SecurityException))
                            {
                                throw ex;
                            }
                        }
                    }

                    // Check if we already have a serialized Configuration object
                    // for this assembly version and assembly last-write date
                    using (new WriteLockDisposable(ConfigCacheLocker))
                        if (ConfigCacheFileExists(connectionString))
                        {
                            var cachedConfig = DeserializeConfig(connectionString);
                            if (cachedConfig != null)
                            {
                                return cachedConfig;
                            }
                        }

                    // We haven't cached config before, or couldn't load it, so dynamically create it

                    // Figure out the FluentNH persistence configurer based on the desired driver
                    var persistenceConfigurer = GetPersistenceConfigurer(nhDriver, connectionString);

                    // Figure out the connection release mode to use, because SqlCe needs "on_close" for perf reasons,
                    // whereas we should use "auto" for everything else to avoid long-running connections
                    var trueConnReleaseMode = connReleaseMode;                            // Could have been set already by a unit test
                    if (connReleaseMode == NHibernateConfigBuilder.CustomConnReleaseMode) // Only modify if it's a value teling us to modify
                    {
                        if (nhDriver == SupportedNHDrivers.MsSqlCe4)
                        {
                            trueConnReleaseMode = "on_close";
                        }
                        else
                        {
                            trueConnReleaseMode = "auto";
                        }
                    }

                    // Configure NH using FluentNH
                    var fluentConfig = Fluently.Configure().Database(persistenceConfigurer)
                                       //.Cache(x =>
                                       //        x.UseMinimalPuts()
                                       //        .UseQueryCache()
                                       //        .UseSecondLevelCache()
                                       //        .ProviderClass(typeof(global::NHibernate.Caches.SysCache2.SysCacheProvider).AssemblyQualifiedName))

                                       // after_transaction does not work for unit tests with Sqlite
                                       .ExposeConfiguration(c => c.SetProperty(Environment.ReleaseConnections, trueConnReleaseMode)
                                                            .SetProperty(Environment.CurrentSessionContextClass, sessionContext)
                                                            .SetProperty(Environment.GenerateStatistics, useNhProfiler.ToString().ToLower())
                                                            .SetProperty(Environment.BatchSize, "20")
                                                            .SetProperty(Environment.ProxyFactoryFactoryClass, typeof(ProxyFactoryFactory).AssemblyQualifiedName))
                                       .Mappings(x =>
                    {
                        // Add named queries from our embedded mappings file
                        x.HbmMappings.AddFromAssembly(fluentMappingsAssembly);

                        // Add class mappings
                        var container = x.FluentMappings.AddFromAssembly(fluentMappingsAssembly);
                        AddConventions(nhDriver, container.Conventions);
                    });

                    if (showSql)
                    {
                        fluentConfig.ExposeConfiguration(c => c.SetProperty(Environment.ShowSql, "true"));
                    }

                    try
                    {
                        // Generate the NHibernate configuration object from FluentNH
                        var nhConfig = fluentConfig.BuildConfiguration();

                        // Add a PostCommitInsert listener which is responsible for passing generated IDs back to the
                        // mapped entities for entity insert scenarios (since the NH mapped objects aren't passed outside
                        // of this provider)
                        if (enablePostCommitListener)
                        {
                            var entitySaveEventListener = new NhEventListeners();
                            nhConfig.SetListener(ListenerType.PostInsert, entitySaveEventListener);
                            nhConfig.SetListener(ListenerType.PostUpdate, entitySaveEventListener);
                            nhConfig.SetListener(ListenerType.PostCommitInsert, entitySaveEventListener);
                            nhConfig.SetListener(ListenerType.PreDelete, entitySaveEventListener);
                            nhConfig.SetListener(ListenerType.Delete, entitySaveEventListener);
                            nhConfig.SetListener(ListenerType.Merge, entitySaveEventListener);
                            nhConfig.SetListener(ListenerType.SaveUpdate, entitySaveEventListener);
                            nhConfig.SetListener(ListenerType.Flush, entitySaveEventListener);
                            nhConfig.SetListener(ListenerType.Evict, entitySaveEventListener);
                            nhConfig.SetListener(ListenerType.PreDelete, entitySaveEventListener);
                        }

                        // Add the Aggregate interceptor for running trigger-like actions that NH can't handle
                        // Disabled, done by event listener instead now: nhConfig.SetInterceptor(new AggregateDataInterceptor());

                        // Add the FluentNH persistence model and configure NH to use it
                        var fluentAutoModel = new AutoPersistenceModel();

                        fluentAutoModel.AddMappingsFromAssembly(fluentMappingsAssembly);
                        fluentAutoModel.BuildMappings();
                        fluentAutoModel.Configure(nhConfig);

                        if (outputNhMappings)
                        {
                            var codeBase = Assembly.GetExecutingAssembly().CodeBase;
                            var uri = new Uri(codeBase);
                            var path = uri.LocalPath;
                            var binFolder = new DirectoryInfo(Path.GetDirectoryName(path));
                            string nhibernateOutputFolder;
                            if (binFolder.Name == "Debug")
                            {
                                nhibernateOutputFolder = Path.Combine(
                                    binFolder.Parent.Parent.FullName, "App_Data", "Logs", "NHibernateConfig");
                            }
                            else
                            {
                                //its just 'bin'
                                nhibernateOutputFolder = Path.Combine(
                                    binFolder.Parent.FullName, "App_Data", "Logs", "NHibernateConfig");
                            }
                            Directory.CreateDirectory(nhibernateOutputFolder);
                            fluentAutoModel.WriteMappingsTo(nhibernateOutputFolder);
                        }

                        SaveConfigurationToFile(nhConfig, connectionString);

                        return nhConfig;
                    }
                    catch (Exception ex)
                    {
                        throw new InvalidOperationException("Cannot build NHibernate configuration", ex);
                    }
                }
            }));
        }