2012-10-17 45 views
0

我是一個仍然discovring NHibernate的,所以也許我的問題是有點笨:(功能NHibernate的hasMany合併

我有以下型號: 問卷-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(答案),那麼一切正常。

但是,如果我一個新的答案添加到調查問卷

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

然後我得到一個異常(System.Reflection.TargetException:「非靜態方法需要一個目標」)。

通過使用SQL事件探查我看到NHibernate的嘗試插入一個空的questionnaireId一個新的答案(有當然是一個非空列)。 我認爲我的映射是錯的,但我看不出有什麼問題。

有人可以幫助我嗎?

感謝&的問候!

回答

0

正如我沒有能夠解決它,我刪除應答的複合主鍵,並添加標識列。 因此我映射變成:?!

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

您的Questionnaire映射是錯誤的。您的密鑰可以爲空,但您已將其映射爲不可空(默認情況下)。我建議你改變你的Questionnaire.Id不是空的整數。

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

EDIT

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

仍然沒有工作:(你有什麼其他的想法感謝 – bregell

+0

@bregell:我心中已經updatet通過回答希望它可以幫助 – Dariusz

+0

我這樣做修改,但它也。不工作。因此,我反正添加標識列的回答表和刪除組合鍵。然後,一切都很好。感謝您的幫助(這些映射顯然是錯誤的):) – bregell