NHibernate - нет обратного на один на один - PullRequest
1 голос
/ 06 декабря 2010

В моем приложении есть 2 объекта, называемые Событием и Транзакцией. Событие может иметь или не иметь транзакцию, но может иметь только транзакцию 1 . Я думал, что лучший способ отобразить это было с отображением HasOne. Пока все в порядке, но я хочу убедиться, что при удалении события оно не будет удалено, если есть транзакция.

Обычно в отношении HasMany я бы просто установил Inverse и изменил Cascade на None. В то время как Каскад существует, Инверсия не существует, и событие удаляется независимо от того, есть ли у него Транзакция или нет.

Буду признателен, если кто-нибудь покажет мне правильный способ сделать это. Спасибо

Ответы [ 2 ]

3 голосов
/ 06 декабря 2010

Вы всегда можете создать свое собственное поведение при удалении, используя DeleteEventListener:

public class DeleteEventListener : DefaultDeleteEventListener
  {
    protected override void DeleteEntity(IEventSource session, object entity, EntityEntry entityEntry, bool isCascadeDeleteEnabled, IEntityPersister persister, ISet transientEntities)
    {
      Event event = entity as Event;
      if (event != null && event.Transaction != null) throw new Exception("You can't delete this Event! Look! It has a Transaction!");
      CascadeBeforeDelete(session, persister, entity, entityEntry, transientEntities);
      CascadeAfterDelete(session, persister, entity, transientEntities);
    }
  }

Этот DeleteEventListener должен быть зарегистрирован как часть вашей конфигурации установки NHibernate. В элементе фабрики сеансов:

<event type="delete">
<listener class="myNamespaces.DeleteEventListener, myAssembly" />
</event> 

Я не тестировал этот конкретный код, но у меня есть похожий код в моем приложении, поэтому я могу помочь, если вы застряли.

1 голос
/ 06 декабря 2010

один к одному означает, что нет внешнего ключа, но есть синхронизированный первичный ключ. это означает, что первичный ключ события берется из транзакции.

Это не имеет ничего общего с каскадами.

Обратное указывает, что отношение разделяет внешний ключ с другим отношением. Например, если существует список (один-ко-многим), он содержит ту же информацию, что и обратная ссылка от элемента в списке к его контейнеру. Поэтому не нужно дважды хранить эту информацию в базе данных, она помечена как «обратная»

В большинстве случаев правильный выбор - «многие к одному». AFAIK, в беглой форме это называется "Список литературы".

...