Ich habe folgendes Modell:löschen Würfen „gelöschte Objekt würde durch Kaskade neu gespeichert werden“
<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>
Es gibt keine Eigenschaften entweder in Person noch in Event PersonEventRegistration zeigt.
Wenn ich versuche, einen Eintrag aus PersonEventRegistration zu löschen, erhalte ich folgende Fehlermeldung:
"deleted object would be re-saved by cascade"
Das Problem ist, ich weiß nicht speichern diese Aufgabe in jeder anderen Sammlung - der Lösch Code wie folgt aussieht:
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;
}
Was mache ich hier falsch?
ich diesen Beitrag nicht bemerkte nicht alle Formatierungen enthielt ... sowieso - das Ereignis und die Person-Zuordnungen enthalten keine Informationen über PersonEventRegistration. Diese Klasse wird verwendet, um das Viele-zu-Viele-Mapping und einige zusätzliche Attribute zu unterstützen (ich habe kein Beispiel gefunden, wo Nhibernate ein solches Szenario unterstützen würde). ich versuche cascade = "delete" trotzdem. – Greg
Ihre Empfehlungen sind genau richtig. Es ist mehr als nur "' all-delete-orphan' hat keine Bedeutung ". Das Überschreiben eines Löschvorgangs von einem untergeordneten Element zu einem übergeordneten Element ist normalerweise _evil_. Das ist es, was "all" und "all-delete-orphan" auf einem "many-to-one" tun würde. Das Löschen der "PersonEventRegistration" mit diesen Kaskaden würde dazu führen, dass NHibernate versucht, die "Person" und das "Ereignis" ebenfalls zu löschen, was Greg nicht beabsichtigt. Aus diesem Grund schlägt das Löschen fehl, da die Person und das Ereignis weiterhin an anderer Stelle referenziert werden, sodass NHibernate sie nicht löschen kann. –
... also ist die richtige Kaskade für ein "many-to-one" normalerweise 'save-update'. –