Как сопоставить составной идентификатор с беглым nhibernate, используя интерфейс? - PullRequest
3 голосов
/ 22 октября 2010

Я пытаюсь переключить .hbm сопоставления на текущие сопоставления и имею проблему с сопоставлением составных идентификаторов и использованием интерфейсов

. Класс выглядит следующим образом:

public class ClassWithCompositeId {
  public virtual IKeyOne KeyOne { get; set; }
  public virtual IKeyTwo KeyTwo { get; set; }
}

наше отображение hbm выглядит следующим образом:

<hibernate-mapping ...>
   <class name="ClassWithCompositeId" table="t_classwithcompositeid">
      <composite-id>      
         <key-many-to-one name="KeyOne" column="colkeyone" class="company.namespace.boSkillBase, BL_Stammdaten" />
         <key-many-to-one name="KeyTwo" column="colkeytwo" class="boQualifikation" />         
      </composite-id>
</hibernate-mapping>

Обратите внимание, что мы получили интерфейсы в классе!Нет, я пытаюсь сопоставить это с Fluent nhibernate.

Map {
   public ClassWithCompositeIdMap() {
         CompositeId()
            .KeyReference(x => x.KeyOne, "colkeyone")
            .KeyReference(x => x.KeyTwo, "colkeytwo");
          ...
   }
}

Но теперь Fluent генерирует отображение следующим образом:

...
 <composite-id mapped="false" unsaved-value="undefined">
      <key-many-to-one name="KeyOne" class="company.namespace.IKeyOne, Interfaces, Version=0.1.4.3379, Culture=neutral, PublicKeyToken=null">
        <column name="colkeyone" />
      </key-many-to-one>
      <key-many-to-one name="KeyTwo" class="company.namespace.IKeyTwo, Interfaces, Version=0.1.4.3379, Culture=neutral, PublicKeyToken=null">
        <column name="colkeytwo" />
      </key-many-to-one>
    </composite-id>
...

Атрибут "Class" теперь указывает на интерфейс, а нереализации этого интерфейса, что приводит к ошибке.

Как я могу сказать Fluent nHibernate использовать другой класс в качестве значения атрибута?

Ответы [ 2 ]

3 голосов
/ 29 октября 2010

Попробуйте загрузить NhGen с SourceForge . Он считывает схемы базы данных и генерирует отображения и классы Fluent и т. Д. Хотя весь код может быть не тем, что вам нужно, он должен начать вас в правильном направлении, поскольку он поддерживает составные ключи и представляет их как отдельные классы от основного объекта. *

Я полагаю, что он использует синтаксис, подобный

 CompositeId()
            .ComponentCompositeIdentifier(x => x.Key, "Namespace.Key, Assembly")
            .KeyProperty(x => x.Key.Id1, "Id1")
            .KeyProperty(x => x.Key.Id2, "Id2")
            .KeyProperty(x => x.Key.Id3, "Id3");
2 голосов
/ 29 октября 2010

Танки!Но я нашел ответ на моем.На самом деле я нашел недостающую особенность в беглом nHibernate.Пол Батум уже добавил эту функцию в ветку разработчика.

Вы бы использовали ее так:

   Map {
      public ClassWithCompositeIdMap() {
            CompositeId()
               .KeyReference(x => x.KeyOne, k =>
                   k.Type<KeyOneImplementation>(), "colkeyone")
               .KeyReference(x => x.KeyTwo, k =>
                   k.Type<KeyTwoImplementation>(), "colkeytwo");
             ...
      }
   }

http://github.com/paulbatum/fluent-nhibernate/tree/dev

Вы можете увидеть оригиналРазговор здесь: http://support.fluentnhibernate.org/discussions/help/349-how-to-map-a-composite-id-when-using-interfaces-or-how-to-change-the-class-attribute-in-the-key-many-to-one-tag

...