Свободный NHibernate: переопределить производные классы не в автоматическом отображении базового класса - PullRequest
3 голосов
/ 04 августа 2009

История: У меня был класс User и класс Organization: User. Я не использовал сопоставления для этих классов, пусть FNH выполняет сопоставление автоматически. Затем я добавил

   public class OrganizationMap : IAutoMappingOverride<Organization>
   {
      public void Override(AutoMap<Organization> mapping)
      {
      }
   }

Обратите внимание, что нет переопределений. Поэтому я не ожидал каких-либо изменений в поведении FNH. Но я получил это (на самом деле во время экспорта схемы):

NHibernate.MappingException: (XmlDocument) (2,4): проверка XML ошибка: элемент 'класс' в пространство имен 'urn: nhibernate-mapping-2.2' имеет неполное содержание. Список ожидаемые возможные элементы: 'мета, выбрать, кэшировать, синхронизировать, комментарий, туплизатор, идентификатор, составной идентификатор в пространстве имен 'Урна: NHibernate-отображение-2,2'

.

Сгенерированный Orders.Core.Organization.hbm.xml был действительно пуст:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="">
  <class name="Orders.Core.Organization, Orders.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="Organizations" xmlns="urn:nhibernate-mapping-2.2" />
</hibernate-mapping>

Итак, после того, как я просмотрел User.hbm, у меня появилась идея - мне нужно переопределить Организацию в базовом классе следующим образом:

   public class UserMap : IAutoMappingOverride<User>
   {
      public void Override(AutoMap<User> mapping)
      {
         mapping.JoinedSubClass<Organization>("ColumnId", m => {...}
         );
      }
   }

Но я бы хотел сделать это в отдельном классе переопределения сопоставления для Organization ... в конце концов, каким будет сопоставление, если у меня будет 5 подклассов в одном методе переопределения.

Возможно ли это?

Ответы [ 2 ]

1 голос
/ 27 августа 2009

Оказалось, что с последним FNH (некоторые ревизии после RC) это возможно сейчас. Интересно, это потому что я спросил; -)

Итак, у меня было это

 mapping.JoinedSubClass<Organization>("UserId", m =>
    {
       m.HasMany(x => x.Currencies).Element("Currency").AsBag();
    }
 );

и он перестал работать после обновления до RC. Затем я переместил это в свой собственный класс

   public class OrganizationMap : IAutoMappingOverride<Organization>
   {
      public void Override(AutoMapping<Organization> mapping)
      {
         mapping.HasMany(x => x.Currencies).Element("Currency").AsBag();
      }
   }

это снова заработало. Как я и хотел! Теперь мне даже не нужно указывать JoinedSubClass, так как это все равно по умолчанию. Я могу просто переопределить свои свойства подкласса, что круто.

Хотя было нелегко понять, почему NH начал жаловаться на ассоциацию строк ... Я даже подумал, что. Элемент не работает в RC. Интересно, почему JoinedSubClass все еще имеет эту часть отображения, если она не работает полностью.

1 голос
/ 19 августа 2009

Ваше переопределение говорит FNH, что вы вручную напишите отображения для этого класса. Ошибка, которую вы получаете, заключается в том, что для Организации ничего не отображается (если вы посмотрите на сгенерированный файл HBM.xml, он будет пустым).

Для чего именно вы хотите написать переопределение?

Edit:

В этом случае вы можете сделать что-то вроде этого:

public class MyAlteration : IAutoMappingAlteration
{
    public void Alter(AutoPersistenceModel model)
    {
        model.ForTypesThatDeriveFrom<User>(
            map => map.HasMany<User>( x => x.Children)
        );
    }       
}

А при настройке беглого nhibernate:

model.Alteration( a => a.Add<MyAlteration>());

Примечание. Используется последняя кодовая база свободно используемого nhibernate (1.0RC).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...