NHibernate - 一对一无逆

时间:2010-12-06 11:11:31

标签: nhibernate nhibernate-mapping

我的应用程序有2个实体,称为事件和事务。事件可能有也可能没有交易,但只能有 1 交易。我认为映射这个的最好方法是使用HasOne映射。到目前为止一切都很好,但我想确保当你删除一个事件时,如果有一个事务,它将不会删除它。

通常在HasMany关系中,我只需设置一个Inverse并将Cascade更改为None。当Cascade存在时,Inverse不存在,并且事件将被删除,无论它是否具有事务。

如果有人能告诉我这样做的正确方法,我会很感激。感谢

2 个答案:

答案 0 :(得分:3)

您始终可以使用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 :(得分:1)

一对一意味着没有外键,而是同步主键。这意味着,Event的主键来自Transaction。

它与级联没有任何关系。

反向表示关系与其他关系共享外键。例如,如果存在列表(一对多),则它包含与列表中的项目到其容器的反向引用相同的信息。因此,它不需要在数据库中存储此信息两次,它被标记为“反向”

在大多数情况下,多对一是正确的选择。 AFAIK,精通它被称为“参考”。