Отображение таблицы на иерархию в существующей базе данных с использованием Fluent NHibernate без столбца дискриминатора - PullRequest
0 голосов
/ 16 января 2012

У меня проблема с отображением таблицы на иерархию в существующую базу данных с использованием Fluent NHibernate (1.2.0.712).Вот упрощенный случай.

Моя структура классов:

Class Diagram

Структура базы данных:

Database diagram

Итакв основном, у нас есть 1 таблица (Entities), которая содержит некоторые конкретные данные (Id и Name) + несколько внешних ключей (для ReferencedObject1 ИЛИ ReferencedObject2).

Абстрактный класс AbstractEntity содержит Id и Name.ConcreteEntity1 и ConcreteEntity2 являются производными классами.

Я хотел бы отобразить эти производные экземпляры в зависимости от ссылок в базе данных, поэтому, если есть ссылка на ReferencedObject1 ->, это экземпляр ConcreteEntity1.Если есть ссылка на ReferencedObject2 -> это экземпляр ConcreteEntity2.

Некоторый код:

public class AbstractEntity
{
    public virtual Guid Id { get; set; }
    public virtual string Name { get; set; }
}
public class ConcreteEntity1 : AbstractEntity
{
    public virtual ReferencedObject1 ReferencedObject1 { get; set; }
}
public class ConcreteEntity2 : AbstractEntity
{
    public virtual ReferencedObject2 ReferencedObject2 { get; set; }
}


public class AbstractEntityMap : ClassMap<AbstractEntity>
{
    public AbstractEntityMap()
    {
        Table("Entities");
        Id(e => e.Id);
        Map(e => e.Name);
    }
}

Так что на самом деле мой вопрос заключается в том, как я должен отображать производные классы?Я просмотрел беглую вики-страницу nhibernate и обнаружил, что

Если вы хотите создать стратегию таблицы для каждой иерархии классов, то вам просто нужно указать столбец дискриминатора в ClassMap.

но, насколько я понимаю, у меня нет столбца дискриминатора.Мой случай состоит в том, чтобы определить подкласс в зависимости от ссылок на внешний ключ.

Примечание: Для нескольких столбцов дискриминатора используйте формулу DiscriminateSubClassesOnColumn (""). ([Вставьте здесь пользовательский sql])

Я не могу найти хороший пример использования формулы.Может ли это быть полезным в моем случае?И я немного растерялся, может я что-то не так делаю?

Может ли кто-нибудь мне помочь?Заранее спасибо:)

1 Ответ

1 голос
/ 16 января 2012
DiscriminateSubClassesOnColumn("")
    .Formula(case when ReferencedObject1id > 0 then 1 else case when ReferencedObject2id > 0 then 2 else ... end)

ConcreteEntity1Map()
{
    DiscriminatorValue(1);
}
...