2012-03-04 24 views
1

是否可以在几个类上分配一个NHibernate-Code-Mapping?是否有可能通过几个类来分发NHibernate-Code-Mappings?

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

我不相信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"); 
+0

谢谢。目标是插件可以修改映射,即EntityMap1将驻留在插件的主应用程序和EntityMap2中。通过使用Linq to XML修改生成的XML来解决此问题(请参阅我的代码答案)。 – Test 2012-03-05 18:05:11

0

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

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

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

相关问题