代码之家  ›  专栏  ›  技术社区  ›  Martin

在nhibernate中映射ilist实例

  •  0
  • Martin  · 技术社区  · 14 年前

    我尝试使用nhibernate(2.1.2)、mysql.data(6.2.2)和mysql服务器(5.1)映射父子关系。我发现这必须用 <bag> 在映射文件中。我构建了一个测试应用程序,它运行时不会产生任何错误,并且正在执行 insert 对于每个条目,但不知何故,子表(parentid)中的外键始终为空(空)。

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

    起源

    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 回复  |  直到 14 年前
        1
  •  1
  •   Diego Mijelshon    14 年前

    您必须将所有数据访问打包到一个事务中。这将起作用:

    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 生成器;使用客户端生成器,它们甚至不会发送到数据库。

        2
  •  -1
  •   Charlie Brown    14 年前
    <class name="Child">
      <id name="Id">
        <generator class="native"/>
      </id>    
      <many-to-one name="Parent" column="ParentID"/>
    </class>