📜  NHibernate-逆关系(1)

📅  最后修改于: 2023-12-03 15:33:07.496000             🧑  作者: Mango

NHibernate-逆关系

简介

在使用ORM框架NHibernate进行数据操作时,通常使用的是正向关系映射,即由类映射到数据库表,而逆关系映射则是由数据库表映射到类,它也可以被称作“反向工程”、“数据库逆向生成”。

通过逆关系映射,我们可以快速地生成实体类,节省了手写POJO(Plain Old Java Object)类的时间,并提高了工作效率。

NHibernate逆关系映射工具

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时可以更加便捷、高效。