मैं मॉडल का अनुसरण किया है "नष्ट कर दिया वस्तु झरना द्वारा फिर से बचाया जाएगा" थ्रो:हटाएं
<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;
}
मैं यहां क्या गलत कर रहा हूं?
मैं उस पोस्ट नोटिस नहीं किया था वैसे भी सभी स्वरूपण ... शामिल नहीं किया - घटना और व्यक्ति मैपिंग PersonEventRegistration के बारे में कोई जानकारी नहीं होती। इस वर्ग का उपयोग कई से अधिक मैपिंग + कुछ अतिरिक्त विशेषताओं का समर्थन करने के लिए किया जाता है (मुझे कोई ऐसा उदाहरण नहीं मिला जहां निबर्ननेट इस तरह के परिदृश्य का समर्थन करेगा)। मैं वैसे भी कैस्केड = "हटाएं" कोशिश करूंगा। – Greg
आपकी सिफारिशें स्पॉट-ऑन हैं। यह सिर्फ "सब-डिलीट-अनाथ" का अर्थ नहीं है "। एक बच्चे से माता-पिता तक एक डिलीट को कैस्केड करना आम तौर पर _evil_ है। यही 'सब' और 'ऑल-डिलीट-अनाथ' 'कई से एक' पर होगा। उन लोगों के साथ 'PersonEventRegistration' को हटाने से NHHernate' व्यक्ति 'और' ईवेंट 'को भी हटाने का प्रयास करेगा, जो निश्चित रूप से ग्रेग का इरादा नहीं है। और यही कारण है कि डिलीट विफल हो जाता है - क्योंकि व्यक्ति और घटना को अभी भी कहीं और संदर्भित किया जाता है, इसलिए NHibernate उन्हें हटा नहीं सकता है। –
... इसलिए 'कई से एक' के लिए सही कैस्केड आमतौर पर 'सेव-अपडेट' होता है। –