流利的nhibernate hasmany合并

时间:2012-10-17 17:22:50

标签: nhibernate fluent-nhibernate

我仍然是一个令人讨厌的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(回答),那么一切正常。

但是,如果我在问卷中添加新答案

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

然后我得到一个异常(System.Reflection.TargetException:“非静态方法需要一个目标”)。

通过使用sql profiler,我看到nhibernate尝试插入一个带有null的新答案作为questionnaireId(当然是一个不可为空的列)。 我认为我的映射是错误的,但我看不出是什么问题。

有人可以帮助我吗?

谢谢&amp;问候!

2 个答案:

答案 0 :(得分:0)

Questionnaire的映射是错误的。你的密钥是可空的,但是你把它映射为不可为空(默认情况下是这样)。我建议您将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; }
}

答案 1 :(得分:0)

由于我无法解决问题,我删除了Answer的复合主键并添加了一个标识列。 因此我的映射变为:

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