我正在尝试使用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()
}
});
}
任何想法我做错了什么?
答案 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>