【问题标题】:fluent nhibernate hasmany merge流畅的nhibernate hasmany合并
【发布时间】:2012-10-17 17:22:50
【问题描述】:

我仍然是一个正在探索的休眠者,所以也许我的问题有点愚蠢:(

我有以下型号: 问卷 -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: "Non-static method requires a target")。

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

有人可以帮我吗?

感谢和问候!

【问题讨论】:

    标签: nhibernate fluent-nhibernate


    【解决方案1】:

    由于无法解决,我删除了 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);
        }
    

    【讨论】:

      【解决方案2】:

      Questionnaire 的映射错误。您的密钥可以为空,但您已将其映射为不可为空(默认情况下)。我建议您将 Questionnaire.Id 更改为 not-nullable 整数。

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

      【讨论】:

      • 我做了这个修改,但它也没有工作。因此,我在答案表中添加了一个标识列并删除了复合键。然后,一切顺利。无论如何感谢您的帮助(这些映射显然是错误的):)
      猜你喜欢
      • 1970-01-01
      • 2015-07-12
      • 2012-09-05
      • 1970-01-01
      • 1970-01-01
      • 2011-03-13
      • 1970-01-01
      • 2012-03-27
      • 1970-01-01
      相关资源
      最近更新 更多