Как сопоставить композитный идентификатор с плавным nhibernate с помощью интерфейса?

Я пытаюсь переключить .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 использовать другой класс в качестве значения атрибута?


person MoJo2600    schedule 22.10.2010    source источник
comment
извините, классы boQualifikation и boSkill должны быть реализацией IKeyOne и IKeyTwo   -  person MoJo2600    schedule 22.10.2010


Ответы (2)


Попробуйте загрузить 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");
person cdmdotnet    schedule 29.10.2010
comment
NhGen звучит отлично, но в SF нет файлов для него :( - person Cocowalla; 29.06.2011

Танки! Но я нашел ответ на своем. Фактически, я обнаружил недостающую функцию в свободном 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

person MoJo2600    schedule 29.10.2010