2012-04-02 9 views
0

Ich verstehe, es gibt mehrere verwandte Fragen und ich habe viele von ihnen angesehen, aber die Lösungen scheinen nicht in meinem Fall zu arbeiten.Fluent NHibernate Mapping ein Wörterbuch der Selbstreferenzen

Ich benutze NH 2.1 mit Fluent (Ja, es ist eine ältere Version, aber es ist ein gemeinsamer Nenner über mehrere verwandte Projekte und es wird einige Arbeit zu aktualisieren), und ich bin im Grunde ein FSM; Dem Benutzer dieses Systems werden nacheinander Fragen gestellt, auf die normalerweise zwei oder mehr Antworten zutreffen. Ihre Antwort führt zur nächsten Frage, die je nach Antwort variieren kann.

Dieses eine Domäne so etwas wie dies schafft (hygienisiert leicht):

public class Question 
{ 
    public virtual int Id { get; set; } 

    /// <summary> 
    /// Gets or sets the "questionnaire" Template in which this Question is asked. 
    /// </summary> 
    /// <value>The template.</value> 
    public virtual QuestionnaireTemplate Template { get; set; } 

    /// <summary> 
    /// Gets or sets a string to be displayed to the user containing the question to answer. 
    /// </summary> 
    /// <value>The question.</value> 
    public virtual string QuestionText { get; set; } 

    /// <summary> 
    /// Gets or sets a Question representing the previous question in the questionnaire. 
    /// </summary> 
    /// <value>The previous question.</value> 
    public virtual Question PreviousQuestion { get; set; } 

    /// <summary> 
    /// Gets or sets a Dictionary of Questions, each representing the question that should follow given a specified answer to the current question. 
    /// Null Values for Keys in this Dictionary represent endpoints of the questionnaire. 
    /// </summary> 
    /// <value>The next questions.</value> 
    public virtual IDictionary<string, Question> NextQuestions { get; set; } 
} 

Also, ich von der Domain erforderlich bin eine selbst verweisende Tabelle zu erstellen; ein einfacher Fremdschlüssel für die vorherige Frage und eine Viele-zu-Viele-Tabelle "Fragenanmerkungen", die durch Frage und Antwort eingegeben wurde und die den Schlüssel der nächsten Frage enthält, die gegeben wurde, um eine bestimmte Antwort auf die aktuelle Frage zu geben.

Hier ist mein Mapping so weit, basierend auf zumindest eine Antwort auf eine ähnliche Frage des Wörterbuch-Mapping:

public TourQuestionMap() 
    { 
     Id(x => x.Id); 
     References(x => x.Template); 
     Map(x => x.QuestionText); 

     References(x => x.PreviousQuestion); 
     HasManyToMany(x => x.NextQuestions) 
      .Table("QuestionAnswers") 
      .ParentKeyColumns.Add("QuestionId", "Answer") 
      .ChildKeyColumn("NextQuestionId") 
      .AsMap("Answer") 
      .Cascade.All(); 
    } 

... aber wenn ich versuche, ein Schema zu exportieren auf dieser Basis, bekomme ich einen Fehler in Bezug auf eine Zuordnung zu einer nicht zugeordneten Entität KeyValuePair, die anzeigen würde, dass ich versuche, das falsche Sammlungskonstrukt in NH zu verwenden. Ich bin nicht sehr erfahren mit der Auflistung von Auflistungen, die nicht die grundlegenden HasMany() - Zuordnungen einer anderen zugeordneten Entität sind.

Hier ist das Grundschema ich bin nach:

Question 
    QuestionId (int, PK, non-nullable) 
    TemplateId (int, FK to Template, not nullable, not an issue AFAIK) 
    QuestionText (string, not nullable) 
    PreviousQuestion (int, FK to Question, nullable, also not an issue AFAIK) 

QuestionAnswer (my problem child) 
    QuestionId (int, PK, FK to Question, not nullable) 
    Answer (string PK, key of Dictionary in domain, not nullable) 
    NextQuestionId (int, FK to Question, nullable) 

Antwort

1

Können Sie separat definieren Antwort und eine Zuordnung für sie zur Verfügung stellen?

Something Like

class Answer 
{ 
    public virtual int Id { get; set; } 
    public virtual string AnswerText { get; set; } 
    public virtual Question NextQuestion { get; set; } 
} 

Jetzt Frage wird

class Question 
{ 
    public virtual int Id { get; set; } 
    public virtual QuestionnaireTemplate Template { get; set; } 
    public virtual string QuestionText { get; set; } 
    public virtual Question PreviousQuestion { get; set; } 
    private List<Answer> answers 
    //Map this 
    public virtual IList<Answer> AnswerList { get return answers; } 
    public virtual IDictionary<string, Answer> Answers {get return answers.ToDictionary(a => a.AnswerText)} 
} 

Ich denke nur, das die Zuordnung vereinfacht.

+0

Dies ist machbar, wenn nicht ideal. Wenn jemand anders nicht die Möglichkeit hat, diese Karte so zu ordnen, wie sie ist, erhalten Sie den Scheck. für jetzt, +1. – KeithS

Verwandte Themen