2012-04-02 2 views
0

Я понимаю, что есть несколько связанных вопросов, и я просмотрел многие из них, но решения, похоже, не работают в моем случае.Fluent NHibernate, отображающий словарь самонаведения

Я использую NH 2.1 с Fluent (да, это более старая версия, но это общий знаменатель по нескольким связанным проектам, и это потребует некоторой работы для обновления), и я в основном сопоставляю FSM; пользователю этой системы задаются вопросы, по одному за раз, на которые обычно выходят два или более ответов, из которых они выбирают. Их ответ приводит к следующему вопросу, который может варьироваться в зависимости от ответа.

Это создает домен что-то вроде этого (слегка облагороженная):

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; } 
} 

Итак, я обязан в области создания автореферентное таблицы; простой внешний ключ к предыдущему вопросу и таблицу «QuestionAnswers» для многих-ко-многим, в которую вставляются вопросы и ответы, содержащие ключ следующего Вопроса, чтобы задать данный конкретный ответ на текущий Вопрос.

Вот мое отображение до сих пор, на основе, по меньшей мере, один ответ на соответствующий вопрос словарь отображения:

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(); 
    } 

... но когда я пытаюсь экспортировать схему, основанную на этом, я получаю сообщение об ошибке относительно ассоциации с неотображаемым объектом KeyValuePair, который указывает, что я пытаюсь использовать неправильную коллекцию коллекции в NH. Я не очень хорошо разбираюсь в сопоставлении коллекции, отличном от базовых сопоставлений HasMany() другого сопоставленного объекта.

Вот основная схема, я после того, как:

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) 

ответ

1

Вы можете определить Ответ отдельно и обеспечить отображение для него?

Something Like

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

Теперь вопрос становится

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)} 
} 

Я просто думаю, что это упрощает отображение.

+0

Это возможно, если не идеально. Если кто-то еще не придумал способ отобразить это как есть, вы получите чек; на данный момент +1. – KeithS

Смежные вопросы