0

私はまだnhibernateを発見しているので、私の質問は少しばかげているかもしれません:(

私は次のモデルを持っています:アンケート-n->回答-1->質問

public class Questionnaire : IEquatable<Questionnaire>
{       
    public virtual int? Id {get;set;}

    public virtual IList<Answer> Answers { get; set; }
}

public class QuestionnaireMap : ClassMap<Questionnaire>
{
    public QuestionnaireMap()
    {
        this.Table("Questionnaire");
        this.Id(questionnaire => questionnaire.Id).GeneratedBy.Identity();
        this.HasMany(questionnaire => questionnaire.Answers).Cascade.AllDeleteOrphan().Inverse().KeyColumn("QuestionnaireId");
    }
}

public class Answer : IEquatable<Answer>
{
    public virtual int QuestionId { get; set; }

    public virtual int? QuestionnaireId { get; set; }

    public virtual bool Value { get; set; }      

    public virtual Questionnaire Questionnaire { get; set; }
}

public class AnswerMap : ClassMap<Answer>
{
    public AnswerMap()
    {
        this.Table("Questionnaire_Answer");

        this.CompositeId()
            .KeyProperty(answer => answer.QuestionId).Mapped()
            .KeyReference(answer => answer.Questionnaire, "QuestionnaireId").Mapped();

        this.Map(answer => answer.Value);
    }
}

エンティティを取得して、新しいエンティティを保存することができます。

残念ながら、「更新」が機能しない場合があります。

アンケートの回答をすべて削除してからsession.Merge(answer)を呼び出すと、すべて正常に機能します。

ただし、アンケートに新しい回答を追加すると

questionnaire.Answers.Add(new Answer { BoolValue = true, QuestionId = 3, Questionnaire = questionnaire });

次に、例外が発生します(System.Reflection.TargetException: "非静的メソッドにはターゲットが必要です")。

sqlプロファイラーを使用すると、nhibernateがquestionIdとしてnullを含む新しい回答を挿入しようとしていることがわかります(もちろん、null不可能な列です)。マッピングが間違っていると思いますが、何が問題なのかわかりません。

誰かが私を助けることができますか?

ありがとうございます。それでは、お元気で!

4

2 に答える 2

0

のマッピングQuestionnaireが間違っています。キーはnull許容ですが、null許容ではないものとしてマップしました(デフォルトでは)。null許容でないQuestionnaire.Id整数に変更することをお勧めします。

public class Questionnaire : IEquatable<Questionnaire>
{   
    // NOT NULLABLE    
    public virtual int Id {get;set;}
    public virtual IList<Answer> Answers { get; set; }
}

編集

public class Answer : IEquatable<Answer>
{
    public virtual int QuestionId { get; set; }

    // NOT NULLABLE - it's used by composite key
    public virtual int QuestionnaireId { get; set; }

    public virtual bool Value { get; set; }      
    public virtual Questionnaire Questionnaire { get; set; }
}
于 2012-10-17T18:24:05.560 に答える
0

解決できなかったため、Answerの複合主キーを削除してID列を追加しました。したがって、私のマッピングは次のようになります。

public AnswerMap()
    {
        this.Table("Questionnaire_Answer");
        this.Id(answer => answer.Id).GeneratedBy.Identity();
        this.References(answer => answer.Questionnaire, "QuestionnaireId").Not.Nullable();
        this.Map(answer => answer.QuestionId).Not.Nullable();
        this.Map(answer => answer.Value);
    }
于 2012-10-18T08:07:47.743 に答える