NHibernate-一对一上无反向

NHibernate-一对一上无反向,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,我的应用程序有两个实体,称为事件和事务。一个事件可以有事务,也可以没有事务,但只能有一个事务。我认为最好的映射方法是使用HasOne映射。到目前为止,一切都很好,但我想确保当您删除事件时,如果有事务,它不会删除它 通常在HasMany关系上,我只会设置一个反向,并将级联更改为无。当级联存在时,Inverse不存在,事件将被删除,无论它是否有事务 如果有人能告诉我正确的方法,我将不胜感激。谢谢一对一意味着没有外键,只有一个同步的主键。这意味着事件的主键取自事务 它与级联没有任何关系 反向表示一个关

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

通常在HasMany关系上,我只会设置一个反向,并将级联更改为无。当级联存在时,Inverse不存在,事件将被删除,无论它是否有事务


如果有人能告诉我正确的方法,我将不胜感激。谢谢

一对一意味着没有外键,只有一个同步的主键。这意味着事件的主键取自事务

它与级联没有任何关系

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


在大多数情况下,多对一是正确的选择。好的,在fluent中它被称为References。

一对一意味着没有外键,而是一个同步的主键。这意味着事件的主键取自事务

它与级联没有任何关系

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


在大多数情况下,多对一是正确的选择。好的,在fluent中称之为引用。

您可以使用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> 

我没有测试过这段特定的代码,但我的应用程序中有类似的代码,因此如果您陷入困境,我可以提供帮助。

您始终可以使用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> 

我还没有测试过这个特定的代码,但我的应用程序中有类似的代码,因此,如果您陷入困境,我可以提供帮助。

干杯,但我没有提及我活动中的交易。我想我可以放置一个可为null的字段并使用引用,但我不喜欢这种方法。可能我的数据库结构允许一对多场景,因此HasMany更有意义,因为我的事件只能有一个事务这一事实更符合业务需求。但是,我仍然希望我的事件上的Transaction属性返回单个实体而不是列表。干杯,但我没有对我的事件上的事务的引用。我想我可以放置一个可为null的字段并使用引用,但我不喜欢这种方法。可能我的数据库结构允许一对多场景,因此HasMany更有意义,因为我的事件只能有一个事务这一事实更符合业务需求。但是,我仍然希望我的事件上的Transaction属性返回单个实体而不是列表。谢谢,这可能是一种方法,因为我的案例可能是一个业务逻辑需求。谢谢,这可能是一种方法,因为我的案例可能是一个业务逻辑需求。