2009-05-31 38 views
6

我有以下型號:刪除拋出「已刪除對象將被重新保存通過級聯」

<class name="Person" table="Person" optimistic-lock="version"> 
    <id name="Id" type="Int32" unsaved-value="0"> 
    <generator class="native" /> 
    </id> 
    <!-- plus some properties here --> 
</class> 

<class name="Event" table="Event" optimistic-lock="version"> 
    <id name="Id" type="Int32" unsaved-value="0"> 
    <generator class="native" /> 
    </id> 
    <!-- plus some properties here --> 
</class> 

<class name="PersonEventRegistration" table="PersonEventRegistration" optimistic-lock="version"> 
    <id name="Id" type="Int32" unsaved-value="0"> 
    <generator class="native" /> 
    </id> 
    <property name="IsComplete" type="Boolean" not-null="true" /> 
    <property name="RegistrationDate" type="DateTime" not-null="true" /> 
    <many-to-one name="Person" class="Person" column="PersonId" foreign-key="FK_PersonEvent_PersonId" cascade="all-delete-orphan" /> 
    <many-to-one name="Event" class="Event" column="EventId" foreign-key="FK_PersonEvent_EventId" cascade="all-delete-orphan" /> 
</class> 

沒有屬性指向PersonEventRegistration親身也不事件。

當我嘗試刪除PersonEventRegistration的條目,我得到以下錯誤:

"deleted object would be re-saved by cascade" 

的問題是,我不存儲任何其他集合這個對象 - 刪除代碼如下所示:

public bool UnregisterFromEvent(Person person, Event entry) 
{ 
    var registrationEntry = this.session 
     .CreateCriteria<PersonEventRegistration>() 
     .Add(Restrictions.Eq("Person", person)) 
     .Add(Restrictions.Eq("Event", entry)) 
     .Add(Restrictions.Eq("IsComplete", false)) 
     .UniqueResult<PersonEventRegistration>(); 

    bool result = false; 
    if (null != registrationEntry) 
    { 
     using (ITransaction tx = this.session.BeginTransaction()) 
     { 
      this.session.Delete(registrationEntry); 
      tx.Commit(); 
      result = true; 
     } 
    } 
    return result; 
} 

我在做什麼錯在這裏?

回答

3

據我所知,cascade="all-delete-orphan"屬於集合映射元素,而不是many-to-one。你沒有顯示你的映射的另外兩個部分,所以我不能肯定地說,但這可能(可能)是這個問題。

我覺得Person應該是這個樣子:

<!-- other properties --> 
<set name="Events" inverse="true" cascade="all-delete-orphan"> 
    <key column="Person_id" /> 
    <one-to-many class="PersonEventRegistration" /> 
</set> 

Event

<!-- similar mapping for Event --> 

PersonEventRegistration

<!-- other properties --> 
<many-to-one name="Person" class="Person" column="PersonId" foreign-key="FK_PersonEvent_PersonId" cascade="delete" <!-- or many ="all" ? --> /> 

實際上,上述可能是相互衝突的級聯(這可能是什麼你有)。所以真的,我的回答是兩件事:

  1. cascade="all-delete-orphan"many-to-one沒有意義。
  2. 確保您真正瞭解如何與您的實體合作,以及它們應如何級聯其操作。
+0

我沒有注意到這個職位不包含所有格式... 無論如何 - 事件和人物映射不包含有關PersonEventRegistration的任何信息。這個類用於支持多對多映射+一些額外的屬性(我沒有找到任何例子,其中nhibernate會支持這種情況)。 反正我會嘗試cascade =「delete」。 – Greg 2009-06-02 05:33:48

1

嘗試取消引用Person和事件中刪除:

public bool UnregisterFromEvent(Person person, Event entry) 
    { 
     var registrationEntry = this.session 
      .CreateCriteria<PersonEventRegistration>() 
      .Add(Restrictions.Eq("Person", person)) 
      .Add(Restrictions.Eq("Event", entry)) 
      .Add(Restrictions.Eq("IsComplete", false)) 
      .UniqueResult<PersonEventRegistration>(); 

     bool result = false; 
     if (null != registrationEntry) 
     { 
      using (ITransaction tx = this.session.BeginTransaction()) 
      { 
       registrationEntry.Person = null; 
       registrationEntry.Event = null; 
       this.session.Delete(registrationEntry); 
       tx.Commit(); 
       result = true; 
      } 
     } 
     return result; 
    } 

另外,我不知道,你可以在對象上增加一個限制,我想這個使用別名和ID採寫。

  .Add(Restrictions.Eq("Person", person)) 
      .Add(Restrictions.Eq("Event", entry)) 
相關問題