当执行测试代码后,子实体和父实体均能保存到数据库,但是子实体对应的数据表中记录的父实体id的值全部为null,数据库为mysql,请问这是正常的么,是否需要设置双向映射后父实体ID才会同步保存?
1) father entity definition:class father
{
   public virtual string name;
   public virtual string id;
   public virtual IList<string> children;
}2) child entity definition:class child
{
   public virtual string id;
   public virtual string name;
}3) mapping file for father<class name ="father" table="dbfather">
<id name="id" column ="id">
  <generator class ="assigned"/>
</id>
<property name ="name"/>
<bag name="ichild">
<key column="fatherid" />
<one-to-many class="child" />
</bag>
</class>4) mapping file for child<class name ="child" table="dbchild">
<id name="id" column ="id">
  <generator class ="assigned"/>
</id>
<property name ="name"/>
</class>5) test codesvar cfg = new NHibernate.Cfg.Configuration().Configure("hibernate.cfg.xml");
        using (ISessionFactory sessionFactory = cfg.BuildSessionFactory())
        {
            ISession session = sessionFactory.OpenSession();
            try
            {
                Child c = new Child();
                c.id= Guid.NewGuid().ToString();
                c.name= "test"; 
                Father f = new Father();
                f.id = Guid.NewGuid().ToString();
                f.name= "ftest";
                f.children.Add(child);                 session.Save(c);
                session.Save(f);
            }
            finally
            {
                session.Flush();
            }
        } 

解决方案 »

  1.   

    打印出来sql自己查查
      

  2.   

    打印出来后有分别insert到父实体对应表和孩子实体对应表的两个sql,但是insert到孩子实体对应表的sql并未包含操作父实体id字段,其次最后也没有一个update语句,因此造成开始的问题,但我想知道的是,是否需要设定双向映射才能解决这个问题还是我本身的哪个映射的设置有问题导致的。
      

  3.   

    单纯的MYSQL中可以通过 last_insert_id()得到上次插入后的自增数字。 但在nhibernate如果实现建议到版块咨询一下。
      

  4.   

    <bag name="ichild">
    <key column="fatherid" />
    <one-to-many class="child" />
    </bag>
    上面的name属性要和父实体定义的多的一端一致也就是你上面的children字段。
    key的column属性要和映射文件一致id