Muhammad Ali Hassan
Muhammad Ali Hassan

Reputation: 962

Nhibernate mapping at run time

I am developing a site in which nhibernate is using. that is working fine for static mapping. but problem that i apply this application on existing database. so is there any way that mapping of classes took place at run time. i mean user provide tables and column names for mapping. Thanks

Upvotes: 2

Views: 1614

Answers (2)

Andrew Shepherd
Andrew Shepherd

Reputation: 45272

From your question I interpret you saying that the POCO classes exists, but you don't know the table or column names at build time.

So, if you already had this class:

public class MyGenericClass 
{
    public virtual long Id { get; set; }
    public virtual string Title { get; set; }
}

You could bind it to a table and columns at runtime:

 string tableName; // Set somewhere else by user input
 string idColumnName; // Set somewhere else by user input
 string titleColumnName; // Set somewhere else by user input

 var configuration = new NHibernate.Cfg.Configuration();
 configuration.Configure();

 var mapper = new NHibernate.Mapping.ByCode.ModelMapper();

 mapper.Class<MyGenericClass>(
           classMapper =>
           {
                classMapper.Table(tableName);
                classMapper.Id(
                      myGenericClass => myGenericClass.Id,
                      idMapper =>
                      {
                          idMapper.Column(idColumnName);
                          idMapper.Generator(Generators.Identity);
                      }
                 );
                 classMapper.Property(c => c.Title,
                                      propertyMapper =>
                                      {
                                          propertyMapper.Column(titleColumnName);
                                      }
                                     );
           }
 );

 ISessionFactory sessionFactory = configuration.BuildSessionFactory();
 ISession session = sessionFactory.OpenSession(); 

 ////////////////////////////////////////////////////////////////////
 // Now we can run an SQL query over this newly specified table
 //
 List<MyGenericClass> items = session.QueryOver<MyGenericClass>().List();

Upvotes: 4

frikinside
frikinside

Reputation: 1244

I don't think that could be possibly with NHibernate, but you could use a workaround. You could use a view instead a table for the NHibernate mapping.

And in runtime, you could create that View or update it with the especified user mapping you need.

For example, you define a mapping in NHibernate to a view named ViewMapped with two columns Name and Mail. And in the other hand, the user has a table with three columns Name, SecondName, EMail. you can create a view on runtime with the following select:

(SELECT Name + ' ' + SecondName as Name, EMail as Mail FROM tableName) AS ViewMapped

I hope that helps you, or at least leads you to a solution.

Upvotes: 0

Related Questions