2012-03-04 1 views
1

Возможно ли распространять NHibernate-by-Code-Mapping по нескольким классам?Можно ли распространять NHibernate-by-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); 
} 

Я пробовал, но отображение PropertyTwo отсутствует в сгенерированном HBML. Есть ли способ достичь этого?

ответ

0

Я не верю, что NHibernate сможет скомпилировать оба вместе, чтобы создать сингулярное отображение. Если целью является использование другого набора сопоставлений в одном приложении по сравнению с другим, вам нужно просто создать два разных сопоставления. Если цель состоит в том, чтобы иметь подклассы, есть интерфейс SubclassMapping, который вы можете расширить.

Edit:

Просматривая мои заметки, расширение на мой ответ о создании другого набора отображений будет случай, когда у вас есть некоторые функции включенных в приложение, которое должно другие (иногда больше, иногда менее вовлечено). Для этого вам необходимо, чтобы 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 в плагине. Решена эта проблема путем изменения сгенерированного XML с использованием Linq в XML (см. Мой ответ для кода). – Test

0

Как описано в моем комментарии к ответу ЧЕТВЕРТЫЙ в цель состояла в том, что плагин может изменить отображение основного приложения, то есть EntityMap1 будет находиться в основной программе и EntityMap2 в плагине. Я мог бы избежать этой проблемы, оставив только EntityMap1 и вручную изменяя созданный XML.

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

oldMappingXml содержит XML, порожденное отображений, определенных в главном приложении и ModifyMappings добавляет необходимые изменения в плагин. Это возможно, потому что изменения, требуемые плагинами, хорошо определены и следуют одному и тому же алгоритму для всех плагинов.