Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
复制Nhibernate 2.1中的子实体?_Nhibernate - Fatal编程技术网

复制Nhibernate 2.1中的子实体?

复制Nhibernate 2.1中的子实体?,nhibernate,Nhibernate,我正在将一个项目从NHibernate1.2迁移到NHibernate2.1,我遇到了一个奇怪的错误。NHibernate正在将子实体的副本加载到集合属性中。还有其他人遇到过这个问题吗?你能提出一个解决方案吗?谢谢你的帮助 下面是问题的细节:我的项目是一个简单的项目经理。感兴趣的三个实体是Project、Task和ProjectNote。项目有两个集合属性“任务”和“注释”,用于保存任务和项目注释对象。我的测试数据有几个项目。项目1有4个任务和2个注释。但当项目1加载时,它显示10个任务和10个

我正在将一个项目从NHibernate1.2迁移到NHibernate2.1,我遇到了一个奇怪的错误。NHibernate正在将子实体的副本加载到集合属性中。还有其他人遇到过这个问题吗?你能提出一个解决方案吗?谢谢你的帮助

下面是问题的细节:我的项目是一个简单的项目经理。感兴趣的三个实体是Project、Task和ProjectNote。项目有两个集合属性“任务”和“注释”,用于保存任务和项目注释对象。我的测试数据有几个项目。项目1有4个任务和2个注释。但当项目1加载时,它显示10个任务和10个注释,每个集合中都有重复。如果加载任何其他项目,我都会得到相同的结果

下面是类和映射文件。首先,我的专题课:

using System.Collections.Generic;

namespace FsProjectManager.Common.Domain
{
    public class Project
    {
        #region Constructor

        public Project()
        {
            Initialize();
        }

        #endregion

        #region Properties

        public virtual int ID { get; set; }

        public virtual int Index { get; set; }

        public virtual string Name { get; set; }

        public virtual IList<ProjectNote> Notes { get; set; }

        public virtual IList<Task> Tasks { get; set; }

        #endregion

        #region Private Methods

        private void Initialize()
        {
            Tasks = new List<Task>();
            Notes = new List<ProjectNote>();
        }

        #endregion
    }
}
以下是Project.hmb.xml文件:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   auto-import="true"
                   assembly="FsProjectManager.Common"
                   namespace="FsProjectManager.Common.Domain">

  <!-- Map class 'Project' -->
  <class name="Project" table="Projects">

    <!-- Identifier column -->
    <id name="ID" column="ID" type ="Int32" unsaved-value="0">
      <generator class="native" />
    </id>

    <!-- Simple properties -->
    <property name="Name" column="Name" type="String" not-null="true" />

    <!-- Collection properties: Parent-side -->
    <bag name="Tasks" table="Tasks" cascade="all-delete-orphan" inverse="true" fetch="join">
      <key column="ProjectID" />
      <one-to-many class="Task" />
    </bag>

    <bag name="Notes" table="ProjectNotes" cascade="all-delete-orphan" inverse="true" fetch="join">
      <key column="ProjectID" />
      <one-to-many class="ProjectNote" />
    </bag>


  </class>

</hibernate-mapping>
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   auto-import="true"
                   assembly="FsProjectManager.Common"
                   namespace="FsProjectManager.Common.Domain">

  <!-- Map class 'Task' -->
  <class name="Task" table="Tasks">

    <!-- Identifier column -->
    <id name="ID" column="ID" type ="Int32" unsaved-value="0">
      <generator class="native" />
    </id>

    <!-- Simple properties -->
    <property name="Description" column="Description" type="String" />
    <property name="DueDate" column="DueDate" type="DateTime" />
    <property name="NumDays" column="NumDays" type="Int32" />

    <!-- Collection properties: Parent-side -->
    <bag name="Notes" table="TaskNotes" cascade="all-delete-orphan" inverse="true" fetch="join">
      <key column="TaskID" />
      <one-to-many class="TaskNote" />
    </bag>

    <!-- Collection properties: Child-side -->
    <many-to-one name="Parent" column="ProjectID" class="Project" not-null="false" fetch="join" />

  </class>

</hibernate-mapping>
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   auto-import="true"
                   assembly="FsProjectManager.Common"
                   namespace="FsProjectManager.Common.Domain">

  <!-- Map class 'ProjectNote' -->
  <class name="ProjectNote" table="ProjectNotes">

    <!-- Identifier column -->
    <id name="ID" column="ID" type ="Int32" unsaved-value="0">
      <generator class="native" />
    </id>

    <!-- Simple properties -->
    <property name="Text" column="Text" type="String" />

    <!-- Collection properties: Child-side -->
    <many-to-one name="Parent" column="ProjectID" class="Project" fetch="join" />

  </class>

</hibernate-mapping>
Task.hbm.xml文件:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   auto-import="true"
                   assembly="FsProjectManager.Common"
                   namespace="FsProjectManager.Common.Domain">

  <!-- Map class 'Project' -->
  <class name="Project" table="Projects">

    <!-- Identifier column -->
    <id name="ID" column="ID" type ="Int32" unsaved-value="0">
      <generator class="native" />
    </id>

    <!-- Simple properties -->
    <property name="Name" column="Name" type="String" not-null="true" />

    <!-- Collection properties: Parent-side -->
    <bag name="Tasks" table="Tasks" cascade="all-delete-orphan" inverse="true" fetch="join">
      <key column="ProjectID" />
      <one-to-many class="Task" />
    </bag>

    <bag name="Notes" table="ProjectNotes" cascade="all-delete-orphan" inverse="true" fetch="join">
      <key column="ProjectID" />
      <one-to-many class="ProjectNote" />
    </bag>


  </class>

</hibernate-mapping>
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   auto-import="true"
                   assembly="FsProjectManager.Common"
                   namespace="FsProjectManager.Common.Domain">

  <!-- Map class 'Task' -->
  <class name="Task" table="Tasks">

    <!-- Identifier column -->
    <id name="ID" column="ID" type ="Int32" unsaved-value="0">
      <generator class="native" />
    </id>

    <!-- Simple properties -->
    <property name="Description" column="Description" type="String" />
    <property name="DueDate" column="DueDate" type="DateTime" />
    <property name="NumDays" column="NumDays" type="Int32" />

    <!-- Collection properties: Parent-side -->
    <bag name="Notes" table="TaskNotes" cascade="all-delete-orphan" inverse="true" fetch="join">
      <key column="TaskID" />
      <one-to-many class="TaskNote" />
    </bag>

    <!-- Collection properties: Child-side -->
    <many-to-one name="Parent" column="ProjectID" class="Project" not-null="false" fetch="join" />

  </class>

</hibernate-mapping>
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   auto-import="true"
                   assembly="FsProjectManager.Common"
                   namespace="FsProjectManager.Common.Domain">

  <!-- Map class 'ProjectNote' -->
  <class name="ProjectNote" table="ProjectNotes">

    <!-- Identifier column -->
    <id name="ID" column="ID" type ="Int32" unsaved-value="0">
      <generator class="native" />
    </id>

    <!-- Simple properties -->
    <property name="Text" column="Text" type="String" />

    <!-- Collection properties: Child-side -->
    <many-to-one name="Parent" column="ProjectID" class="Project" fetch="join" />

  </class>

</hibernate-mapping>
以及我的ProjectNote.hbm.xml文件:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   auto-import="true"
                   assembly="FsProjectManager.Common"
                   namespace="FsProjectManager.Common.Domain">

  <!-- Map class 'Project' -->
  <class name="Project" table="Projects">

    <!-- Identifier column -->
    <id name="ID" column="ID" type ="Int32" unsaved-value="0">
      <generator class="native" />
    </id>

    <!-- Simple properties -->
    <property name="Name" column="Name" type="String" not-null="true" />

    <!-- Collection properties: Parent-side -->
    <bag name="Tasks" table="Tasks" cascade="all-delete-orphan" inverse="true" fetch="join">
      <key column="ProjectID" />
      <one-to-many class="Task" />
    </bag>

    <bag name="Notes" table="ProjectNotes" cascade="all-delete-orphan" inverse="true" fetch="join">
      <key column="ProjectID" />
      <one-to-many class="ProjectNote" />
    </bag>


  </class>

</hibernate-mapping>
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   auto-import="true"
                   assembly="FsProjectManager.Common"
                   namespace="FsProjectManager.Common.Domain">

  <!-- Map class 'Task' -->
  <class name="Task" table="Tasks">

    <!-- Identifier column -->
    <id name="ID" column="ID" type ="Int32" unsaved-value="0">
      <generator class="native" />
    </id>

    <!-- Simple properties -->
    <property name="Description" column="Description" type="String" />
    <property name="DueDate" column="DueDate" type="DateTime" />
    <property name="NumDays" column="NumDays" type="Int32" />

    <!-- Collection properties: Parent-side -->
    <bag name="Notes" table="TaskNotes" cascade="all-delete-orphan" inverse="true" fetch="join">
      <key column="TaskID" />
      <one-to-many class="TaskNote" />
    </bag>

    <!-- Collection properties: Child-side -->
    <many-to-one name="Parent" column="ProjectID" class="Project" not-null="false" fetch="join" />

  </class>

</hibernate-mapping>
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   auto-import="true"
                   assembly="FsProjectManager.Common"
                   namespace="FsProjectManager.Common.Domain">

  <!-- Map class 'ProjectNote' -->
  <class name="ProjectNote" table="ProjectNotes">

    <!-- Identifier column -->
    <id name="ID" column="ID" type ="Int32" unsaved-value="0">
      <generator class="native" />
    </id>

    <!-- Simple properties -->
    <property name="Text" column="Text" type="String" />

    <!-- Collection properties: Child-side -->
    <many-to-one name="Parent" column="ProjectID" class="Project" fetch="join" />

  </class>

</hibernate-mapping>

我不确定修复方法是什么,但我认为问题是您的2个集合被标记为fetch='join'。将生成的SQL将返回10行。我想快速修复方法应该是对集合使用fetch='select'。

实际上,更简单的解决方案是完全删除'fetch'属性并使用默认值。谢谢你,克里斯!