是否可以在多个类上分发NHibernate-by-Code-Mapping?
E.g。
public class EntityMap1 : ClassMapping<Entity> {
Id(x => x.Id);
Property(x => x.PropertyOne);
}
public class EntityMap2 : ClassMapping<Entity> {
Property(x => x.PropertyTwo);
}
我尝试了,但生成的HBML中缺少PropertyTwo
的映射。有没有办法实现这个目标?
答案 0 :(得分:0)
我不相信NHibernate能够一起编译以创建一个奇异的映射。如果目标是在一个应用程序中使用不同的映射集与另一个应用程序,则需要简单地创建两个不同的映射。如果目标是拥有子类,则可以扩展SubclassMapping接口。
编辑:
在查看我的笔记时,关于创建不同映射集的答案的扩展将是您的应用程序中插入一些需要不同(有时更多,有时更少参与)映射的功能的情况。要做到这一点,您需要让NHibernate单独生成它们并将它们分别添加到配置中。使用约定,这将创建两个独立的映射集(包含一些重叠但不同映射的entites),这些映射插入到一个配置中:
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");
答案 1 :(得分:0)
正如我对Fourth的回答所述,目标是插件可以修改主应用程序的映射,即EntityMap1
将驻留在主程序中,而EntityMap2
将驻留在插件中。我可以通过仅保留EntityMap1
并手动修改生成的XML来避免此问题。
var domainMapping = mapper.CompileMappingForAllExplicitlyAddedEntities();
var oldMappingXml = domainMapping.AsString();
var newMappingXml = ModifyMappings(oldMappingXml);
configuration.AddXmlString(newMappingXml);
oldMappingXml
包含由主应用程序中定义的映射生成的XML,ModifyMappings
添加插件所需的更改。这是可能的,因为插件所需的更改已经很好地定义,并且对所有插件都遵循相同的算法。