运行时的Nhibernate映射

时间:2014-03-07 12:42:52

标签: nhibernate fluent-nhibernate nhibernate-mapping

我正在开发一个nhibernate正在使用的网站。这适用于静态映射。但是我在现有数据库上应用此应用程序的问题。所以有没有办法在运行时发生类映射。我的意思是用户提供映射的表和列名称。感谢

2 个答案:

答案 0 :(得分:2)

根据你的问题,我解释你说POCO类存在,但你不知道构建时的表名或列名。

所以,如果你已经有了这个课程:

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

您可以在运行时将其绑定到表和列:

 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();

答案 1 :(得分:0)

我不认为这可能与NHibernate有关,但你可以使用一种解决方法。 您可以使用视图而不是表来进行NHibernate映射。

在运行时,您可以创建该视图或使用您需要的特定用户映射更新它。

例如,您将NHibernate中的映射定义为名为ViewMapped的视图,其中包含两列NameMail。 另一方面,用户有一个包含三列NameSecondNameEMail的表格。 您可以使用以下选择在运行时创建视图:

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

我希望这可以帮助您,或者至少引导您找到解决方案。