nhibernate多对一父对象在插入时始终为null

时间:2011-11-16 13:50:22

标签: wcf nhibernate

我在WCF中使用NHibernate 3.1.0.4000和AutoMapper 2.0.0.0。我有一个父母与孩子的关系,我想从“很多”结束。如果我从“一”端完成维护对象,我没有问题,但在这种情况下没有意义。我的问题是无论我如何更改我的映射,POCO等,当我尝试添加子项时,父对象在子项中为null,导致插入失败。为了让孩子的父属性得到填充,我错过了什么? 我在下表中定义了父子关系:

    Create Table Attribute (AttributeUID uniqueidentifier, LongName varchar(20))
    Create Table AnswerOption (AnswerOptionID int, AttributeUID uniqueidentifier)

我希望Attribute(父)是所有者,因此我在该映射文件中声明关系,而不是在AnswerOption(child)中。虽然,我已尝试过双向关系,并且在我的测试中没有改变任何行为。我的映射如下。属性:

    <class name="RCAttribute" table="rcs.tblAttribute">
     <cache usage="read-write"/>
      <id name="ID">
        <column name="AttributeUID" />
        <generator class="guid" />
      </id>
      <property name="LongName" type="string" not-null="true" length="200" column="LongName" />
      <bag name="AnswerOptions" lazy="true" inverse="true" cascade="all">
        <key column="AttributeUID"/>
        <one-to-many class="AnswerOption" />
      </bag>
    </class>

AnswerOption:

    <class name="AnswerOption" table="rcs.tblAnswerOption" lazy="true">
      <cache usage="read-write"/>
      <id name="ID">
        <column name="AnswerOptionID" />
        <generator class="native" />
      </id>
    </class>

属性类:

    [Serializable]
    public class RCAttribute
    {
        public virtual Guid ID { get; set; }
        public virtual string LongName { get; set; }
        public virtual ICollection<AnswerOption> AnswerOptions { get; set; }

        public RCAttribute() { ID = new Guid("00000000-0000-0000-0000-000000000000"); }
     }

AnswerOption Class:

   [Serializable]
   public class AnswerOption
   {
       public virtual int ID { get; set; }

       public AnswerOption() { ID = 0; }
    }

我的测试程序看起来像这样;

    public void CreateAnswerOption()
    {
        AnswerOption newOpt = new AnswerOption();
        Attribute.AnswerOptions.Add(newOpt);
        Attribute = rc.RCAttributeSave(Attribute);
    }

当创建它时,AnswerOption的Attribute属性为null,因此无法插入,因为在这种情况下父节点中的父节点不能为空。我错过了什么来填充子项上的父属性并能够插入?

1 个答案:

答案 0 :(得分:3)

将集合映射为反向而不映射另一侧的多对一映射是没有意义的。

您有三种选择:

  1. 在收集方使用inverse="true"的双向映射,并在保存孩子之前在代码中设置多对一的属性(父级引用)(是的,我读过你不想做的事情)就这样)。
  2. 仅映射收集方(反向)。然后NHibernate将首先插入带有NULL作为父引用的子节点,但是会在同一事务中使用正确的父ID更新它。因此,您不能在子表中的父ID列上具有非空约束(至少它必须是可延迟的)。
  3. (此选项仅适用于NHibernate 3.2.0或更高版本)与选项2相同,但将not-null="true"添加到集合映射中的key标记。然后NHibernate将插入已设置父ID的子项。