private void Model <T>(Func <Member, bool> convention) { model = new PrivateAutoPersistenceModel() .Setup(conventions => conventions.FindMappablePrivateProperties = convention); model.AddTypeSource(new StubTypeSource(typeof(T))); model.CompileMappings(); model.BuildMappings(); }
private void VerifyMapping(AutoPersistenceModel model, Action <CompositeIdMapping> verifier) { var idMapping = model.BuildMappings() .First() .Classes .First() .Id ; idMapping.ShouldBeOfType(typeof(CompositeIdMapping)); verifier((CompositeIdMapping)idMapping); }
public AutoPersistenceModel BuildPersistenceModel() { var persistenceModel = new AutoPersistenceModel(); persistenceModel.Conventions.Setup(c => { c.Add(typeof(ForeignKeyNameConvention)); c.Add(typeof(ReferenceConvention)); c.Add(typeof(PrimaryKeyNameConvention)); c.Add(typeof(TableNameConvention)); }); persistenceModel.AddMappingsFromAssembly(AssemblyMapper); persistenceModel.BuildMappings(); persistenceModel.WriteMappingsTo(@"./"); return(persistenceModel); }
public AutoPersistenceModel BuildPersistenceModel() { var persistenceModel = new AutoPersistenceModel(); persistenceModel.Conventions.Setup(c => { c.Add(typeof (ForeignKeyNameConvention)); c.Add(typeof (ReferenceConvention)); c.Add(typeof (PrimaryKeyNameConvention)); c.Add(typeof (TableNameConvention)); }); persistenceModel.AddMappingsFromAssembly(AssemblyMapper); persistenceModel.BuildMappings(); persistenceModel.WriteMappingsTo(@"./"); return persistenceModel; }
public static IEnumerable <string> GetHBMFilesForFluentFromCSProj(CSProjFile csproj, string outputPath) { string assemblyName = csproj.GetAssemblyName(); IEnumerable <string> outputPaths = csproj.GetOutputPaths(); DateTime latestAssemblyDate = new DateTime(1900, 1, 1); string latestAssembly = ""; foreach (string folder in outputPaths) { string assemblyPath = Path.Combine(folder, assemblyName); if (File.Exists(assemblyPath)) { DateTime lastWriteTime = File.GetLastWriteTimeUtc(assemblyPath); if (lastWriteTime > latestAssemblyDate) { latestAssemblyDate = lastWriteTime; latestAssembly = assemblyPath; } } } if (string.IsNullOrEmpty(latestAssembly)) { throw new FluentNHibernateCompiledAssemblyMissingException("No compiled assembly found. A compiled assembly is required for Fluent NHibernate. Please recompile your project."); } System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFrom(latestAssembly); FluentCompileLatestAssemblyDir = Path.GetDirectoryName(latestAssembly); try { assembly.ModuleResolve += new System.Reflection.ModuleResolveEventHandler(assembly_ModuleResolve); AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += new ResolveEventHandler(CurrentDomain_ReflectionOnlyAssemblyResolve); if (!Directory.Exists(outputPath)) { Directory.CreateDirectory(outputPath); } //var sessionFactory = FluentNHibernate.Cfg.Fluently.Configure() // .Database(FluentNHibernate.Cfg.Db.MsSqlConfiguration.MsSql2008 // .ConnectionString("Data Source=STN_DEV;Initial Catalog=FNHProviderDB;Integrated Security=SSPI;") // ) // .Mappings(m => m.FluentMappings.AddFromAssembly(assembly).ExportTo(outputPath)) // .BuildConfiguration(); AutoPersistenceModel mappings = new AutoPersistenceModel(); mappings.AddMappingsFromAssembly(assembly); mappings.BuildMappings(); mappings.WriteMappingsTo(outputPath); return(Directory.GetFiles(outputPath).ToList()); } finally { assembly.ModuleResolve -= assembly_ModuleResolve; AppDomain.CurrentDomain.AssemblyResolve -= CurrentDomain_AssemblyResolve; AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve -= CurrentDomain_ReflectionOnlyAssemblyResolve; } }
public static ClassMapping BuildMappingFor <T>(this AutoPersistenceModel model) { return(model.BuildMappings() .SelectMany(x => x.Classes) .FirstOrDefault(x => x.Type == typeof(T))); }
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); } } })); }
private void VerifyMapping(AutoPersistenceModel model, Action<CompositeIdMapping> verifier) { var idMapping = model.BuildMappings() .First() .Classes .First() .Id ; idMapping.ShouldBeOfType(typeof(CompositeIdMapping)); verifier((CompositeIdMapping)idMapping); }
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); } } })); }
public static IEnumerable<string> GetHBMFilesForFluentFromCSProj(CSProjFile csproj, string outputPath) { string assemblyName = csproj.GetAssemblyName(); IEnumerable<string> outputPaths = csproj.GetOutputPaths(); DateTime latestAssemblyDate = new DateTime(1900, 1, 1); string latestAssembly = ""; foreach (string folder in outputPaths) { string assemblyPath = Path.Combine(folder, assemblyName); if (File.Exists(assemblyPath)) { DateTime lastWriteTime = File.GetLastWriteTimeUtc(assemblyPath); if (lastWriteTime > latestAssemblyDate) { latestAssemblyDate = lastWriteTime; latestAssembly = assemblyPath; } } } if (string.IsNullOrEmpty(latestAssembly)) throw new FluentNHibernateCompiledAssemblyMissingException("No compiled assembly found. A compiled assembly is required for Fluent NHibernate. Please recompile your project."); System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFrom(latestAssembly); FluentCompileLatestAssemblyDir = Path.GetDirectoryName(latestAssembly); try { assembly.ModuleResolve += new System.Reflection.ModuleResolveEventHandler(assembly_ModuleResolve); AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += new ResolveEventHandler(CurrentDomain_ReflectionOnlyAssemblyResolve); if (!Directory.Exists(outputPath)) Directory.CreateDirectory(outputPath); //var sessionFactory = FluentNHibernate.Cfg.Fluently.Configure() // .Database(FluentNHibernate.Cfg.Db.MsSqlConfiguration.MsSql2008 // .ConnectionString("Data Source=STN_DEV;Initial Catalog=FNHProviderDB;Integrated Security=SSPI;") // ) // .Mappings(m => m.FluentMappings.AddFromAssembly(assembly).ExportTo(outputPath)) // .BuildConfiguration(); AutoPersistenceModel mappings = new AutoPersistenceModel(); mappings.AddMappingsFromAssembly(assembly); mappings.BuildMappings(); mappings.WriteMappingsTo(outputPath); return Directory.GetFiles(outputPath).ToList(); } finally { assembly.ModuleResolve -= assembly_ModuleResolve; AppDomain.CurrentDomain.AssemblyResolve -= CurrentDomain_AssemblyResolve; AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve -= CurrentDomain_ReflectionOnlyAssemblyResolve; } }