是否可以通过代码映射将NHibernate分发到多个类上?
是否可以通过在几个类上进行代码映射来分发NHibernate 例如是否可以通过代码映射将NHibernate分发到多个类上?,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,是否可以通过在几个类上进行代码映射来分发NHibernate 例如 公共类EntityMap1:类映射{ Id(x=>x.Id); 属性(x=>x.PropertyOne); } 公共类EntityMap2:类映射{ 属性(x=>x.PropertyTwo); } 我试过了,但是生成的HBML中缺少属性two的映射。有什么方法可以做到这一点吗?我不相信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);