我正在开发一个nhibernate正在使用的网站。这适用于静态映射。但是我在现有数据库上应用此应用程序的问题。所以有没有办法在运行时发生类映射。我的意思是用户提供映射的表和列名称。感谢
答案 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
的视图,其中包含两列Name
和Mail
。
另一方面,用户有一个包含三列Name
,SecondName
,EMail
的表格。
您可以使用以下选择在运行时创建视图:
(SELECT Name + ' ' + SecondName as Name, EMail as Mail FROM tableName) AS ViewMapped
我希望这可以帮助您,或者至少引导您找到解决方案。