私はまだ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不可能な列です)。マッピングが間違っていると思いますが、何が問題なのかわかりません。
誰かが私を助けることができますか?
ありがとうございます。それでは、お元気で!