2012-10-17 46 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