Структура данных:
- Таблица [Анкета] верхнего узла
- Таблица [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");
}
}