Fluent NHibernate - 如何将List <interface>映射到多种类型?</interface>

时间:2011-06-28 08:05:23

标签: fluent-nhibernate fluent-nhibernate-mapping

我正在尝试映射包含不同类型实例的列表,这些实例都实现了与Fluent NHibernate的通用接口。 下面是我希望模型看起来如何的简化示例。我希望所有类型的问题都存储在同一个表中,并且所有类型的答案都存储在每个类型的一个表中。 在调查示例中使用Mapping时,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; } 
}

1 个答案:

答案 0 :(得分:0)

ReferencesAny应该做你想做的事。