2009-08-28 49 views
0

我不明白为什么NHibernate试图插入父对象 - 当行已经​​存在于数据库中 - 当我插入子行时。Nhibernate - 为什么插入子代时试图插入现有父行

父映射:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true"> 
<class name="ReportDistribution.Client.ReportMgr.Model.ClientReport, ReportDistribution.Client.ReportMgr.Model" 
    table="ClientReport" 
    lazy="false" 
    dynamic-update="true"> 
<id name="Id" access="property" column="ReportID"> 
    <generator class="assigned"></generator> 
</id> 
<property name="MaxAge" access="property" /> 
<property name="DeleteUnread" access="property" /> 
<property name="Description" access="property" /> 
<property name="Name" access="property" /> 
<bag name="ClientPublications" cascade="all" lazy="false"> 
    <key column="ReportID" /> 
    <one-to-many class="ReportDistribution.Client.ReportMgr.Model.ClientPublication, ReportDistribution.Client.ReportMgr.Model" />   
</bag> 
</class> 
</hibernate-mapping> 

儿童映射:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true"> 
<class name="ReportDistribution.Client.ReportMgr.Model.ClientPublication, ReportDistribution.Client.ReportMgr.Model" 
    table="ClientPublication" 
    lazy="false" 
    dynamic-update="true"> 
<id name="Id" access="property" column="PublicationID"> 
    <generator class="assigned"></generator> 
</id> 
<property name="CreatedOn" access="property" type="DateTime"></property> 
<property name="IsMarkedForDeletion" access="property"></property> 
<property name="IsDeleted" access="property"></property> 
<property name="HasBeenRead" access="property"></property> 
<property name="ReceivedOn" access="property" type="DateTime"></property> 
<property name="FileExtension" access="property"></property> 
<property name="IsDownloaded" access="property"></property> 
<property name="MustRead" access="property"></property> 
<many-to-one  
    name="Report" 
    class="ReportDistribution.Client.ReportMgr.Model.ClientReport, ReportDistribution.Client.ReportMgr.Model" 
    lazy="false" 
    column="ReportID"> 
</many-to-one> 
</class> 
</hibernate-mapping> 

父类(报告)的属性是子类的集合。 Child类(Publication)拥有属于父对象的属性。

在此先感谢....

+0

您是否尝试过在ClientPublications包中放置inverse = true? – Rashack 2009-08-28 13:18:38

+0

我得到一个ADOException,因为它将NULL插入到PublicationId列中。 – empo 2009-08-28 14:08:44

+0

对不起,忽略最后一条评论是因为我会将id生成器更改为“native”。 – empo 2009-08-28 14:12:33

回答

0

这听起来好像父对象不再连接到会话时要保存的孩子。 HNibernate跟踪连接到会话的实体的状态,但是如果实体变得分离,它将失去跟踪状态的能力。

想想这样 - 如果一个实体没有通过你正在使用的ISession的确切实例,那么它不知道它存在。因此,它将所有从未被视为“新”的事物视为对待。

一个选项可能是使用ISession.Load(entity);在保存前重新加载父母。