Свободное отображение внутреннего соединения Nhibernate на 3 таблицы - PullRequest
2 голосов
/ 04 февраля 2009

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

  • Таблица [Анкета] верхнего узла
  • Таблица [QuestionGroup] просто группировка для заголовка и т. д.
  • Таблица [Анкета Вопросника] [Question] <-> [QuestionGroup] отношение многих ко многим, а [Анкета] <-> [Question] отношение многих ко многим
  • Таблица [Вопрос]

Один вопрос может существовать во многих вопросниках / группах вопросов для целей отчетности. Таблица QuestionnaireQuestion также содержит некоторые свойства для Question, которые могут отличаться от анкеты к анкете, например Required? проверка и т. д. Что я не могу понять, так это как сопоставить Вопрос. Требуется? Свойство является уникальным при фильтрации таблицы вопросника по вопроснику: questionnaire_id и question_id

Когда я загружаю анкету, я предоставляю вопросник_id, который затем дает мне список групп вопросов, каждая группа которых содержит список вопросов (хотя при этом отсутствуют свойства проверки).

Пока что мои отображения таковы:

   public class QuestionnaireMap : ClassMap<Questionnaire>
    {
        public QuestionnaireMap(){
            WithTable("ida_questionnaire");
            SetAttribute("lazy", "false");
            Id(x => x.ID, "ida_questionnaire_id")
                .WithUnsavedValue(0)
                .GeneratedBy.UuidHex("");

        Map(x => x.Description);

        HasMany<QuestionGroup>(x => x.QuestionGroups)
            .IsInverse()
            .WithKeyColumn("ida_questionnaire_id")
            .AsBag().SetAttribute("cascade", "all");
    }
}

public class QuestionGroupMap : ClassMap<QuestionGroup>
{
    public QuestionGroupMap()
    {
        WithTable("ida_questionnaire_group");
        SetAttribute("lazy", "false");
        Id(x => x.ID, "ida_questionnaire_group_id")
            .WithUnsavedValue(0)
            .GeneratedBy
            .UuidHex("");
        Map(x => x.Description).AsReadOnly();

        //References(x => x.Parent, "ida_questionnaire_id");

        HasManyToMany<Question>(x => x.Questions)
            .WithTableName("ida_questionnaire_question")
            .WithParentKeyColumn("ida_questionnaire_group_id")
            .WithChildKeyColumn("ida_question_id")
            .Cascade.All()
            .IsInverse();
    }
}

public class QuestionMap : ClassMap<Question>
{
    public QuestionMap()
    {
        WithTable("ida_question");
        Id(x => x.ID, "ida_question_id").WithUnsavedValue(0).GeneratedBy.UuidHex("");
        Map(x => x.Description, "description").AsReadOnly();
        Map(x => x.Type, "ida_question_type_id").AsReadOnly();

        Component<Core.Validator>(x => x.MyValidator, m =>
            {
                m.Map(x => x.Type, "ida_question_type_id");
                m.Map(x => x.RangeMin, "validate_min");
                m.Map(x => x.RangeMax, "validate_max");
            });

        HasMany<Alternative>(x => x.Alternatives)
            .IsInverse()
            .WithKeyColumn("ida_question_id")
            .AsBag().SetAttribute("cascade", "all");
    }
}

1 Ответ

1 голос
/ 04 февраля 2009

Вам необходимо отобразить Анкету Вопросника как отдельную сущность. Кайл Бэйли привел хороший пример в своих отношениях «многие ко многим» с данными, прикрепленными в публикации NHibernate .

...