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.