Можно ли распределить сопоставления NHibernate-by-Code по нескольким классам? - PullRequest
0 голосов
/ 04 марта 2012

Возможно ли распределение NHibernate-by-Code-Mapping по нескольким классам?

* 1003 Е.Г. *

public class EntityMap1 : ClassMapping<Entity> {
  Id(x => x.Id);
  Property(x => x.PropertyOne);
}

public class EntityMap2 : ClassMapping<Entity> {
  Property(x => x.PropertyTwo);
}

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

Ответы [ 2 ]

0 голосов
/ 05 марта 2012

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

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

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

0 голосов
/ 05 марта 2012

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

Edit:

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