我的应用程序有2个实体,称为事件和事务。事件可能有也可能没有交易,但只能有 1 交易。我认为映射这个的最好方法是使用HasOne映射。到目前为止一切都很好,但我想确保当你删除一个事件时,如果有一个事务,它将不会删除它。
通常在HasMany关系中,我只需设置一个Inverse并将Cascade更改为None。当Cascade存在时,Inverse不存在,并且事件将被删除,无论它是否具有事务。
如果有人能告诉我这样做的正确方法,我会很感激。感谢
答案 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,精通它被称为“参考”。