Here's an NHibernateInitializer class I use with mapping by code,

It should take care of everything you need.

using NHibernate.Cfg;
using NHibernate.Cfg.MappingSchema;
using NHibernate.Dialect;
using NHibernate.Driver;
using NHibernate.Event;
using NHibernate.Extensions.Domain;
using NHibernate.Extensions.EventListeners;
using NHibernate.Extensions.Interceptors;
using NHibernate.Extensions.Mapping;
using NHibernate.Mapping.ByCode;
using NHibernate.Tool.hbm2ddl;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;

namespace NHibernate.Extensions
{
public abstract class NHibernateInitializer : IDomainMapper
{
        private String MappingAssemblyName =

System.Configuration.ConfigurationManager.AppSettings["NHibernate.Mapping.Assembly"];

protected Configuration Configure;
private ISessionFactory _sessionFactory;
        private ModelMapper _mapper = new ModelMapper();
        private Assembly _mappingAssembly;

        public ISessionFactory SessionFactory
        {
            get
            {
                if
(System.Configuration.ConfigurationManager.ConnectionStrings[System.Environment.MachineName]
== null)
                    throw new
System.Configuration.ConfigurationErrorsException(String.Format("Connection
string {0} does not exist.", System.Environment.MachineName));

                if
(String.IsNullOrWhiteSpace(System.Configuration.ConfigurationManager.ConnectionStrings[System.Environment.MachineName].ConnectionString))
                    throw new
System.Configuration.ConfigurationErrorsException(String.Format("Connection
string {0} is empty.", System.Environment.MachineName));

                return _sessionFactory ?? (_sessionFactory =
Configure.BuildSessionFactory());
            }
        }

        private Assembly MappingAssembly
        {
            get
            {
                if (String.IsNullOrEmpty(MappingAssemblyName))
                    throw new
System.Configuration.ConfigurationErrorsException("NHibernate.Mapping.Assembly
key not set in application config file.");

                return _mappingAssembly ?? (_mappingAssembly =
Assembly.Load(MappingAssemblyName));
            }
        }

        public void Initialize()
{
Configure = new Configuration();
            Configure.SetInterceptor(new StaleInterceptor());
            Configure.EventListeners.PreInsertEventListeners = new
IPreInsertEventListener[] { new EventListener() };
            Configure.EventListeners.PreUpdateEventListeners = new
IPreUpdateEventListener[] { new EventListener() };

Configure.SessionFactoryName(System.Configuration.ConfigurationManager.AppSettings["SessionFactoryName"]);
Configure.DataBaseIntegration(db =>
                              {
                               db.Dialect<MsSql2008Dialect>();
                               db.Driver<SqlClientDriver>();
                               db.KeywordsAutoImport =
Hbm2DDLKeyWords.AutoQuote;
                               db.IsolationLevel =
IsolationLevel.ReadCommitted;
                               db.ConnectionStringName =
System.Environment.MachineName;
                               db.BatchSize = 20;
                               db.Timeout = 10;
                               db.HqlToSqlSubstitutions = "true 1, false 0,
yes 'Y', no 'N'";
                                            db.LogFormattedSql = true;
                              });
            Configure.SessionFactory().GenerateStatistics();

Map();
}

public void CreateSchema()
{
new SchemaExport(Configure).Create(false, true);
}

public void DropSchema()
{
new SchemaExport(Configure).Drop(false, true);
}

        public void UpdateSchema()
        {
            new SchemaUpdate(Configure).Execute(false, true);
        }

private void Map()
{
            _mapper.AddMappings(MappingAssembly.GetExportedTypes());

Configure.AddDeserializedMapping(_mapper.CompileMappingForAllExplicitlyAddedEntities(),
"MyWholeDomain");
}

        public HbmMapping HbmMapping
        {
            get { return _mapper.CompileMappingFor(GetDomainEntities()); }
        }

        public IList<HbmMapping> HbmMappings
        {
            get { return
_mapper.CompileMappingForEach(GetDomainEntities()).ToList(); }
        }

/// <summary>
/// Gets the domain entities.
/// </summary>
/// <returns></returns>
        /// <remarks>by default anything that derives from EntityBase and
isn't abstract or generic</remarks>
protected virtual IEnumerable<System.Type> GetDomainEntities()
{
            List<System.Type> domainEntities = (from t in
MappingAssembly.GetExportedTypes()
                                                where
typeof(EntityBase<Guid>).IsAssignableFrom(t)
                                                && (!t.IsGenericType ||
!t.IsAbstract)
                                                select t
                                               ).ToList();

            return domainEntities;
}

        protected virtual IEnumerable<System.Type> GetMappingClasses()
        {
            List<System.Type> domainEntities = (from t in
MappingAssembly.GetExportedTypes()
                                                where
typeof(MapBase<>).IsAssignableFrom(t)
                                                && (!t.IsGenericType ||
!t.IsAbstract)
                                                select t
                                   ).ToList();

            return domainEntities;
        }
}
}


On Thu, Jun 26, 2014 at 8:27 PM, Michael Murphy <[email protected]>
wrote:

> Ricardo,
>
> Thank you, very much.  That worked!  Additionally, in case any other
> newbie is reading this later, this page (NHibernate 3.2 mapping sample)
> <http://lycog.com/programming/nhibernate-32-mapping-code-basic-mapping/> has
> some additional info that is very helpful.  In particular if all the models
> and mappings are in a single assembly, rather than specifying each mapping
> this appears to work.
>
>
>     public InMemoryDatabaseTest(Assembly assemblyContainingMapping) {
>       try {
>         if (Configuration == null) {
>           Configuration = new Configuration()
>             .SetProperty(NHibernate.Cfg.Environment.ConnectionProvider,
> "NHibernate.Connection.DriverConnectionProvider")
>             .SetProperty(NHibernate.Cfg.Environment.ConnectionDriver,
> typeof(SQLite20Driver).AssemblyQualifiedName)
>             .SetProperty(NHibernate.Cfg.Environment.ConnectionString,
> "Data Source=:memory:;Version=3;New=True;")
>             .SetProperty(NHibernate.Cfg.Environment.ShowSql, "false")
>             .SetProperty(NHibernate.Cfg.Environment.Dialect,
> typeof(SQLiteDialect).AssemblyQualifiedName)
>             .SetProperty(NHibernate.Cfg.Environment.ReleaseConnections,
> "on_close")
>             .SetProperty(NHibernate.Cfg.Environment.MaxFetchDepth, "1")
>             .AddAssembly(assemblyContainingMapping);
>
>           //mapper = new ModelMapper();
>           //mapper.AddMapping<ModelMap>();
>           //mapper.AddMapping<NumberedEntityMap>();
>           //mapper.AddMapping<PersonMap>();
>           mapper = new ModelMapper();
>           mapper.AddMappings(assemblyContainingMapping.GetExportedTypes());
>           mappings = mapper.CompileMappingForAllExplicitlyAddedEntities();
>           Configuration.AddDeserializedMapping(mappings, null);
>
>           SessionFactory = Configuration.BuildSessionFactory();
>         }
>
>         session = SessionFactory.OpenSession();
>         connection = session.Connection;
>         new SchemaExport(Configuration)
>           .SetOutputFile(".\\sqlite.sql")
>           .Execute(true, true, false, connection, Console.Out);
>
>       } catch (Exception ex) {
>         throw;
>       }
>     }
>
>
> Honestly the part that confused me was the bit about
> .AddAssembly(assemblyContainingMapping).  I'd expected that to take care of
> the mapper and mappings part.  Thank you again, Ricardo!
>
>
> On Thursday, June 26, 2014 6:33:58 PM UTC-5, Ricardo Peres wrote:
>>
>> Try this before building the session factory:
>>
>> var mapper = new ModelMapper();
>> mapper.AddMapping<ModelMap>();
>> var mappings = mapper.CompileMappingForAllExplicitlyAddedEntities();
>> Configuration.AddDeserializedMapping(mappings, null);
>>
>> RP
>>
>>
>> On Thursday, June 26, 2014 10:57:53 PM UTC+1, Michael Murphy wrote:
>>>
>>> Hello all,
>>>
>>> I've been using Castle ActiveRecord and am interested in starting a new
>>> project using just NHibernate.  I'd like to use the latest stable release
>>> which appears to be v3.3.3.4001.  I'd like to use the Mapping ByCode
>>> feature since that is similar to the Castle ActiveRecord that I have been
>>> working with and seems to offer me the quickest approach to working.  I've
>>> created a simple class
>>>
>>>   public class Model {
>>>     public virtual long ID { get; set; }
>>>
>>>   }
>>>
>>>   public class ModelMap : ClassMapping<Model> {
>>>     public ModelMap() {
>>>       Id(x => x.ID, m => m.Generator(Generators.Identity));
>>>       Lazy(false);
>>>     }
>>>   }
>>>
>>>
>>> i've created a simple MSTest Unit Test
>>> using SyLogis.Models;
>>> using Microsoft.VisualStudio.TestTools.UnitTesting;
>>> namespace TestProject1
>>> {
>>>   [TestClass()]
>>>   public class ModelTest {
>>>
>>>     static InMemoryDatabaseTest imdb = null;
>>>
>>>
>>>     [ClassInitialize()]
>>>     public static void MyClassInitialize(TestContext testContext) {
>>>       System.Reflection.Assembly assembly = typeof(NumberedEntityMap).
>>> Assembly;
>>>       imdb = new InMemoryDatabaseTest(assembly);
>>>     }
>>>
>>>     [TestMethod()]
>>>     public void ID_Test() {
>>>       Model target = new Model(); // TODO: Initialize to an appropriate
>>> value
>>>       long expected = 1; // TODO: Initialize to an appropriate value
>>>       long actual;
>>>       target.ID = expected;
>>>       actual = target.ID;
>>>       imdb.session.Save(target);
>>>       target = null;
>>>       target = imdb.session.Get<Model>(expected);
>>>       Assert.AreEqual<long>(expected, target.ID);
>>>     }
>>>   }
>>> }
>>>
>>>  and here is the inmemory piece
>>> using System;
>>> using System.Collections.Generic;
>>> using System.Linq;
>>> using System.Text;
>>> using NHibernate;
>>> using NHibernate.Cfg;
>>> using NHibernate.Tool.hbm2ddl;
>>> using System.Reflection;
>>> using System.Data;
>>>
>>>
>>> namespace TestProject1 {
>>>
>>>   public class InMemoryDatabaseTest : IDisposable {
>>>
>>>     public static Configuration Configuration;
>>>     public static ISessionFactory SessionFactory;
>>>     public ISession session;
>>>     public IDbConnection connection;
>>>
>>>     public InMemoryDatabaseTest(Assembly assemblyContainingMapping) {
>>>       try {
>>>         if (Configuration == null) {
>>>           Configuration = new Configuration()
>>>             .SetProperty(NHibernate.Cfg.Environment.ConnectionProvider,
>>> "NHibernate.Connection.DriverConnectionProvider")
>>>             .SetProperty(NHibernate.Cfg.Environment.ConnectionDriver,
>>> typeof(SQLite20Driver).AssemblyQualifiedName)
>>>             .SetProperty(NHibernate.Cfg.Environment.ConnectionString,
>>> "Data Source=:memory:;Version=3;New=True;")
>>>             .SetProperty(NHibernate.Cfg.Environment.ShowSql, "false")
>>>             .SetProperty(NHibernate.Cfg.Environment.Dialect,
>>> typeof(SQLiteDialect).AssemblyQualifiedName)
>>>             .SetProperty(NHibernate.Cfg.Environment.ReleaseConnections,
>>> "on_close")
>>>             .SetProperty(NHibernate.Cfg.Environment.MaxFetchDepth, "1")
>>>             .AddAssembly(assemblyContainingMapping);
>>>
>>>           SessionFactory = Configuration.BuildSessionFactory();
>>>         }
>>>
>>>         session = SessionFactory.OpenSession();
>>>         connection = session.Connection;
>>>         new SchemaExport(Configuration)
>>>           .SetOutputFile(".\\sqlite.sql")
>>>           .Execute(true, true, false, connection, Console.Out);
>>>
>>>       } catch (Exception ex) {
>>>         throw;
>>>       }
>>>     }
>>>
>>>
>>>     public void Dispose() {
>>>       session.Dispose();
>>>     }
>>>   }
>>> }
>>>
>>>
>>> when i run the test it goes fine until it gets to the Save step at which
>>> point it throws an exception and the test details says there's no
>>> persister.  I'm not certain what I'm doing wrong.  I don't have any hbm.xml
>>> files to add as Embedded Resources (but I thought that was the point of
>>> Mapping ByCode).  I would appreciate any suggestions.
>>>
>>> Also all the NHibernate Getting Started samples I can find are for
>>> v3.1.0 of NHibernate or even more often v2.1.x or similar.  Are there any
>>> Getting Started samples using v3.3.3?  If anyone has a working Visual
>>> Studio Solution using NHibernate v3.3.3 and could send it to me or post it
>>> somewhere, that would be much appreciated.  Thanks in advance.  Have a
>>> great day!
>>>
>>>
>>>  --
> You received this message because you are subscribed to the Google Groups
> "nhusers" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/nhusers.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/nhusers.
For more options, visit https://groups.google.com/d/optout.

Reply via email to