Fluent Nhibernate在3个表上映射内连接

时间:2022-09-15 16:43:18

Datastructure is:

  • Table[Questionnaire] the top node
  • 表[问卷调查]*节点

  • Table[QuestionGroup] just a grouping for heading etc
  • 表[QuestionGroup]只是标题等的分组

  • Table[QuestionnaireQuestion] mapping [Question]<->[QuestionGroup]s many to many relationship and the [Questionnaire]<->[Question]s many to many relationship
  • 表[QuestionnaireQuestion]映射[问题] < - > [QuestionGroup] s多对多关系和[问卷调查] < - > [问题] s多对多的关系

  • Table[Question]

One question can exist in many questionnaires/questiongroups for reporting purposes. The table QuestionnaireQuestion also contains some properties for Question that may differ from questionnaire to questionnaire, like Required? validation etc. What i can't figure out is how to map Question.Required?. The property is unique when filtering the questionnairequestion table on questionnaire_id and question_id

许多问卷/问题组中可能存在一个问题,用于报告目的。问卷调查表还包含问卷的一些属性,这些属性可能与调查问卷不同,如必填项?验证等。我想不出的是如何映射Question.Required?。在过滤调查表_id和question_id上的问卷调查表时,该属性是唯一的

When i load the questionnaire i supply a questionnaire_id which then gives me a List of QuestionGroups each group containing a List of Questions(although missing the validation properties).

当我加载问卷时,我提供了一个问卷调查表,然后给我一个问题组列表,每个组包含一个问题列表(虽然缺少验证属性)。

So far my mappings are:

到目前为止,我的映射是:

   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


You need to map QuestionnaireQuestion as a separate entity. Kyle Bailey gives a good example in his Many-to-many relationships with data attached in NHibernate post.

您需要将QuestionnaireQuestion映射为单独的实体。 Kyle Bailey在NHibernate帖子中附加数据的多对多关系中给出了一个很好的例子。

#1


You need to map QuestionnaireQuestion as a separate entity. Kyle Bailey gives a good example in his Many-to-many relationships with data attached in NHibernate post.

您需要将QuestionnaireQuestion映射为单独的实体。 Kyle Bailey在NHibernate帖子中附加数据的多对多关系中给出了一个很好的例子。