与NHibernate保持父/子关系

时间:2013-03-15 12:12:01

标签: nhibernate nhibernate-mapping

我正在使用Entity Developer从c#中的数据库生成业务类和映射。

之前我使用过Entity Framework,看起来NHibernate中的pilosophy非常不同。

例如我的问题是Entity Developer生成的类暴露了不同实体之间的关系,但没有做任何事情来保持这些关系同步。

我们来看一下简单的父/子例子。我在DB中创建了两个Parent和Child表,Child表有一个ParentId列,它是Parent表的外键。

Entity Developer生成了Parent和Child类,Child类中有Parent属性,Parent类中有Child的集合。

现在,此代码生成异常,因为Child实例未设置其Parent属性:

class Program
{
    static void Main(string[] args)
    {
        Parent parent = new Parent();
        Child child = new Child();

        parent.Children.Add(child);

        if (child.Parent == null)
        {
            throw new Exception("The parent in the Child entity was not set");
        }
    }
}

与Entity Framework相同的代码不会抛出异常。 EF生成的类嵌入了所有逻辑,以保持两侧的关系同步。

我想知道是否有办法生成相同的行为并使用NHibernate作为映射器? 这是Entity Developer的限制吗?是否有另一种工具可以生成能够保持这些关系同步的实体类?或者我是否错误地配置了Entity Developer?

提前致谢。

修改

以下是映射:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping default-cascade="save-update" assembly="ConsoleApplication6" namespace="ConsoleApplication6" xmlns="urn:nhibernate-mapping-2.2">
  <class name="Child" table="Child" schema="dbo">
    <id name="Id" type="Int32">
      <column name="Id" not-null="true" precision="10" scale="0" sql-type="int" />
      <generator class="identity" />
    </id>
    <many-to-one name="Parent" class="Parent">
      <column name="ParentId" not-null="true" precision="10" scale="0" sql-type="int" />
    </many-to-one>
  </class>
</hibernate-mapping>

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping default-cascade="save-update" assembly="ConsoleApplication6" namespace="ConsoleApplication6" xmlns="urn:nhibernate-mapping-2.2">
  <class name="Parent" table="Parent" schema="dbo">
    <id name="Id" type="Int32">
      <column name="Id" not-null="true" precision="10" scale="0" sql-type="int" />
      <generator class="identity" />
    </id>
    <bag name="Children" inverse="true" generic="true">
      <key>
        <column name="ParentId" />
      </key>
      <one-to-many class="Child" />
    </bag>
  </class>
</hibernate-mapping>

0 个答案:

没有答案