【问题标题】:Mapping an instance of IList in NHibernate在 NHibernate 中映射 IList 的实例
【发布时间】:2010-04-07 01:12:22
【问题描述】:

我正在尝试使用 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() 
            } 
        });
}

任何想法我做错了什么?

【问题讨论】:

    标签: c# .net nhibernate mapping


    【解决方案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 生成器而被执行;使用客户端生成器,它们甚至不会被发送到数据库。

    【讨论】:

    【解决方案2】:
    <class name="Child">
      <id name="Id">
        <generator class="native"/>
      </id>    
      <many-to-one name="Parent" column="ParentID"/>
    </class>
    

    【讨论】:

    • 这对我没有帮助,因为我想将孩子列表映射到父母 - 而不是相反。
    • 这就是为什么我有一个多对一。孩子是多方面,父母是一方面。在我们所有的映射中,我们指定了双方并且它有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2011-07-07
    • 2011-09-28
    • 2010-12-14
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    相关资源
    最近更新 更多