Свободное отображение NHibernate, объединение подклассов - PullRequest
8 голосов
/ 25 ноября 2008

Я пытаюсь отобразить сценарий присоединенного подкласса, используя Fluent NHibernate. У меня есть класс Entity, определенный в пространстве имен Core, и класс Подкласс: объект в пространстве имен SomeModule

Теперь я явно не хочу, чтобы класс Entity знал о его производных типы, пространство имен SomeModules ссылается на ядро ​​- не иначе вокруг.

Все примеры, которые мне удалось найти, используют что-то вроде:

public class EntityMap : ClassMap<Entity> {
    public EntityMap() {
        Id(x => x.Id)

        var subClassMap = JoinedSubClass<SubClass>("SubClassId", sub => sub.Map(x => x.Id));

        subClassMap.Map(x => x.SomeProperty)
        ...
    }
}

Это просто не сработает в моей ситуации - мне нужно что-то похожее на Отображение NHibernate xml:

<joined-subclass name="SubClass" extends="Entity, Core" >
<key column="SubClassId" foreign-key="FK_KollegiumEntity"/>
<property name="Name" length="255" not-null="true" />
...
</joined-subclass>

Кто-нибудь достиг этого с Fluent NHibernate?

Ответы [ 5 ]

10 голосов
/ 06 мая 2010

Я думаю, что API изменился с тех пор, как был задан этот вопрос, но у меня это работает:

public class SomeSubclassMap : SubclassMap<SomeSubclass> {
    public SomeSubclassMap()
    {
        KeyColumn("SomeKeyColumnID");
        Map(x => x.SomeSubClassProperty);
        ...
    }
}

Я считаю, что KeyColumn требуется, только если он отличается от 'Baseclassname_id'

Примечание: также должен быть ClassMap<SomeBaseClass> для базового класса, который расширяет SomeSubClass.

1 голос
/ 06 января 2009

Магнус (или Приз),

Вы выяснили, как использовать этот последний пример в родительском классе отображения? Это сработало для меня, но я не люблю сам создавать экземпляр SubClassMap:

public class EntityMap : ClassMap<Entity> {
 public EntityMap() {
    Id(x => x.Id)
    AddPart(new SubClassMap()); // Adds the subclass mapping!
 }
}

public class SubClassMap : JoinedSubClassPart<SubClass>
{
    public SubClassMap()
        : base("SubClassId")
    {
         Map(x => x.Name); 
         Map(x => x.SomeProperty); 
    }
}

, который произвел запрос, подобный:

SELECT
  this_.Id as Id2_2
  this_.Name as Name3_2
  this_.SomeProperty as SomeProperty3_2
FROM
  SubClass this_ inner join
    Entity this_1 on this_.Id=this_1.Id
1 голос
/ 17 декабря 2008

Извините, пропустил ваш комментарий, нашел это

public class SubClassMap : JoinedSubClassPart< SubClass >
{
    public SubClassMap()
        : base("SubClassId")
    {
         Map(x => x.Name); 
         Map(x => x.SomeProperty); 
    }
}

Надеюсь, это поможет, если вы еще не решили это.

0 голосов
/ 05 декабря 2008

Магнус, у меня была точно такая же проблема, и твое предложение разобрало ее.

Второй параметр JoinedSubClass выполняет действие SubClassPart для вашего объекта типа SubT. Следовательно, вам нужно только сопоставить дополнительные поля в вашем подклассе.

Этот предыдущий пример отображает Id, так что я предполагаю, что это отличный идентификатор от значения, к которому присоединяются база и подкласс, в противном случае вы начнете видеть ошибки SqlParameterCollection.

0 голосов
/ 27 ноября 2008

Здравствуйте, сделал что-то подобное несколько дней назад.

public class EntityMap : ClassMap<Entity> {
 public EntityMap() {
    Id(x => x.Id)

    JoinedSubClass<SubClass>("SubClassId", sub => { 
          sub.Map(x => x.Name); 
          sub.Map(x => x.SomeProperty); 
    });
 }
}

Надеюсь, это поможет

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