1

Fluent NHibernate との共通のインターフェイスをすべて実装するさまざまな型のインスタンスを含むリストをマップしようとしています。以下は、モデルをどのように見せたいかの簡単な例です。すべてのタイプの質問を同じテーブルに保存し、すべてのタイプの回答をタイプごとに 1 つのテーブルに保存したいと考えています。調査の例でマッピングを使用すると、Nhibernate はすべての質問を IQuestion として扱い、すべての回答を IAnswer として扱います。

public class SurveyMap : ClassMap<Survey>
{
    public SurveyMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);
        HasMany(x => x.Questions).Cascade.All();
        HasMany(x => x.Answers).Cascade.All();
    }
}

public class BoolAnswerMap : SubclassMap<BoolAnswer>
{
    public BoolAnswerMap()
    {
        Map(x => x.Value).Nullable();
        References(x => x.Question);
    }
}

public class DecimalAnswerMap : SubclassMap<DecimalAnswer>
{
    public DecimalAnswerMap()
    {
        Map(x => x.Value).Nullable();
        References(x => x.Question);
    }
}

public class AnswerMap : ClassMap<IAnswer>
{
    public AnswerMap()
    {
        Id(x => x.Id);

    }
}

public class BoolQuestionMap : SubclassMap<BoolQuestion>
{
    public BoolQuestionMap()
    {
        //HasMany(x => x.SubQuestions).Cascade.All(); -- Let's leave the subquestions for now

    }
}

public class DecimalQuestionMap : SubclassMap<DecimalQuestion>
{
    public DecimalQuestionMap()
    {
    }
}

public class QuestionMap : ClassMap<IQuestion>
{
    public QuestionMap()
    {
        Id(x => x.Id);
        Map(x => x.QuestionText).Not.Nullable();
        DiscriminateSubClassesOnColumn("Type");

    }
}

public class Survey{
    private IList<IQuestion> questions = new List<IQuestion>();
    private IList<IAnswer> answers = new List<IAnswer>();

        public virtual string Name { get; set; }
    public virtual IEnumerable<IQuestion> Questions { get { return questions; } }
        public virtual IEnumerable<IAnswer> Answers { get { return answers; } }

    public virtual void AddQuestion(IQuestion question){
        questions.Add(question);
    }

    public virtual void AddAnswer(IAnswer answer{
        answers.Add(answer);
    }

}


public interface IQuestion{
    int Id { get; set; };
    string QuestionText { get; set; }
}

public interface IAnswer{
    int Id { get; set; }
    IQuestion Question { get; set; }
}

public class BoolQuestion: IQuestion{
    private IList<IQuestion> subQuestions = new List<IQuestion>();

    int Id { get; set; };
    string QuestionText { get; set; }

        public virtual IEnumerable<IQuestion> SubQuestions { get { return subQuestions; } }

    public virtual void AddSubQuestion(IQuestion question){
        subQuestions.Add(question);
    }

}

//You could argue that this could be just Question (but this is a simplified example)
public class DecimalQuestion: IQuestion{
    int Id { get; set; };
    string QuestionText { get; set; }

}

public class BoolAnswer : IAnswer {
    public int Id { get; set; }
    public IQuestion Question { get; set; }
    bool Value { get; set; }

}

public class DecimalAnswer : IAnswer {
    public int Id { get; set; }
    public IQuestion Question { get; set; }
    decimal Value { get; set; } 
}
4

1 に答える 1

0

ReferencesAnyは、あなたが望むことを行う必要があります。

于 2011-07-13T08:33:16.683 に答える