是否可以通过代码映射将NHibernate分发到多个类上?

是否可以通过代码映射将NHibernate分发到多个类上?,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,是否可以通过在几个类上进行代码映射来分发NHibernate 例如 公共类EntityMap1:类映射{ Id(x=>x.Id); 属性(x=>x.PropertyOne); } 公共类EntityMap2:类映射{ 属性(x=>x.PropertyTwo); } 我试过了,但是生成的HBML中缺少属性two的映射。有什么方法可以做到这一点吗?我不相信NHibernate能够同时编译这两者来创建一个单一的映射。如果目标是在一个应用程序与另一个应用程序中使用不同的映射集,则只需创建两个不同的映射

是否可以通过在几个类上进行代码映射来分发NHibernate

例如

公共类EntityMap1:类映射{
Id(x=>x.Id);
属性(x=>x.PropertyOne);
}
公共类EntityMap2:类映射{
属性(x=>x.PropertyTwo);
}

我试过了,但是生成的HBML中缺少
属性two
的映射。有什么方法可以做到这一点吗?

我不相信NHibernate能够同时编译这两者来创建一个单一的映射。如果目标是在一个应用程序与另一个应用程序中使用不同的映射集,则只需创建两个不同的映射即可。如果目标是拥有子类,那么可以扩展子类映射接口

编辑:

在查看我的笔记时,我的回答中关于创建不同映射集的一个扩展是,您的应用程序中插入了一些需要不同(有时更多,有时更少)映射的功能。要做到这一点,您需要让NHibernate单独生成它们,并将它们单独添加到配置中。使用约定,这将创建两组单独的映射(其中包含一些重叠但映射方式不同的实体),并插入到一个配置中:

NHibernateConfiguration.BeforeBindMapping += (sender, args) => args.Mapping.autoimport = false;

            var pluginMappings = new PluginMapper().Mappings;

            foreach (var hbmMapping in pluginMappings)
                NHibernateConfiguration.AddDeserializedMapping(hbmMapping, "PluginModel");

            var mainAppMappings = new AppMapper().Mappings;

            foreach (var hbmMapping in mainAppMappings)
                NHibernateConfiguration.AddDeserializedMapping(hbmMapping, "AppModel");

正如我在对第四个答案的评论中所述,目标是插件可以修改主应用程序的映射,即
EntityMap1
将驻留在主程序中,而
EntityMap2
将驻留在插件中。我可以通过只保留
EntityMap1
并手动修改生成的XML来避免这个问题

var domainMapping = mapper.CompileMappingForAllExplicitlyAddedEntities();
var oldMappingXml = domainMapping.AsString();
var newMappingXml = ModifyMappings(oldMappingXml);
configuration.AddXmlString(newMappingXml);

oldMappingXml
包含由主应用程序中定义的映射生成的XML,
ModifyMappings
添加插件所需的更改。这是可能的,因为插件所需的更改定义良好,并且所有插件都遵循相同的算法。

谢谢。目标是插件可以修改映射,即EntityMap1将驻留在主应用程序中,EntityMap2将驻留在插件中。通过使用Linq to XML修改生成的XML解决了这个问题(代码请参见我的答案)。
var domainMapping = mapper.CompileMappingForAllExplicitlyAddedEntities();
var oldMappingXml = domainMapping.AsString();
var newMappingXml = ModifyMappings(oldMappingXml);
configuration.AddXmlString(newMappingXml);