在NHibernate中映射IList的实例

时间:2010-04-06 16:12:16

标签: c# .net nhibernate mapping

我正在尝试使用NHibernate(2.1.2),MySql.Data(6.2.2)和MySQL Server(5.1)映射父子关系。我发现这必须使用映射文件中的<bag>来完成。我构建了一个运行的测试应用程序,但没有产生任何错误,并为每个条目执行insert,但不知何故,子表(ParentId)中的外键始终为空(null)。

以下是我的代码的重要部分......

public class Parent
{
    public virtual int Id { get; set; }
    public virtual IList<Child> Children { get; set; }
}


<class name="Parent">
  <id name="Id">
    <generator class="native"/>
  </id>        
  <bag name="Children" cascade="all">
    <key column="ParentId"/>
    <one-to-many class="Child"/>
  </bag>    
</class>

public class Child
{
    public virtual int Id { get; set; }
}

<class name="Child">
  <id name="Id">
    <generator class="native"/>
  </id>    
</class>

程序

using (ISession session = sessionFactory.OpenSession())
{                                
     session.Save(
        new Parent() 
        {
            Children = new List<Child>() 
            { 
                new Child(), 
                new Child() 
            } 
        });
}

任何想法我做错了什么?

2 个答案:

答案 0 :(得分:1)

您必须在交易中包装所有数据访问权限。这将有效:

using (ISession session = sessionFactory.OpenSession())
using (ITransaction tx = session.BeginTransaction())
{                                
     session.Save(
        new Parent() 
        {
            Children = new List<Child>() 
            { 
                new Child(), 
                new Child() 
            } 
        });
     tx.Commit();
}

事实上,只是在执行插入操作,因为您使用的是native生成器;使用客户端生成器,它们甚至不会被发送到数据库。

答案 1 :(得分:-1)

<class name="Child">
  <id name="Id">
    <generator class="native"/>
  </id>    
  <many-to-one name="Parent" column="ParentID"/>
</class>