📅  最后修改于: 2023-12-03 15:33:07.496000             🧑  作者: Mango
在使用ORM框架NHibernate进行数据操作时,通常使用的是正向关系映射,即由类映射到数据库表,而逆关系映射则是由数据库表映射到类,它也可以被称作“反向工程”、“数据库逆向生成”。
通过逆关系映射,我们可以快速地生成实体类,节省了手写POJO(Plain Old Java Object)类的时间,并提高了工作效率。
NHibernate官方提供了一个逆关系映射工具——NHibernate.Mapping.ByCode,用于替代以前的Nhibernate.Mapping.Attributes和Nhibernate.Cfg.XML。
NHibernate.Mapping.ByCode采用基于C#的DSL(Domain Specific Language)格式,使映射更加简洁、易读,支持Linq查询等语法。
以下是一个简单的使用案例:
using NHibernate.Cfg;
using NHibernate.Mapping.ByCode;
using NHibernate.Mapping.ByCode.Conformist;
public static void GenerateClassMapFile(string connectionStr, string dbType, string tableName, string modelName, string modelNameSpace, string outputPath)
{
var mapper = new ModelMapper();
mapper.AddMappings(Assembly.GetExecutingAssembly().GetTypes());
mapper.BeforeMapClass += (inspector, type, customizer) => customizer.Schema(tableName);
var mapping = mapper.CompileMappingFor(new[] { Assembly.GetExecutingAssembly().GetType(modelNameSpace + "." + modelName) });
using (var file = new StreamWriter(outputPath))
{
file.Write(mapping.AsString());
}
}
在生成逆向实体类之前,需要使用NHibernate的ISessionFactory和NHibernate.Cfg.Configuration,以及使用已经定义好的逆向映射类。
以下是一个记录查询世界各地城市信息的逆向映射类:
namespace NHibernateDemo.Models.Mapping
{
public class CityMap : ClassMapping<City>
{
public CityMap()
{
Table("City");
Id(x => x.ID, x => x.Generator(Generators.Identity));
Property(x => x.Name);
Property(x => x.CountryCode, x => x.NotNullable(true));
Property(x => x.District);
Property(x => x.Population);
}
}
}
然后,使用以下代码生成逆向实体类:
Configuration config = new Configuration();
config.Configure();
config.AddAssembly(typeof(CityMap).Assembly);
ISessionFactory sessionFactory = config.BuildSessionFactory();
using (ISession session = sessionFactory.OpenSession())
{
var metadata = new NHibernate.Metadata.ClassMetadata[1];
metadata[0] = session.SessionFactory.GetClassMetadata(typeof(City));
new HbmExporter(config).Execute(false, false, false, false, metadata);
}
在指定的路径下,可以找到生成的实体类。
通过NHiberate的逆向工程,我们可以快速生成实体类,省去了手写POJO类的时间,提高了工作效率。虽然NHibernate.Mapping.ByCode的语法看起来有些复杂,但它提供了完整、丰富的ORM映射功能,使我们在使用ORM框架NHibernate时可以更加便捷、高效。