2010-12-06 5 views
1

내 응용 프로그램에는 이벤트 및 트랜잭션이라는 2 개의 엔티티가 있습니다. 이벤트는 트랜잭션이 있거나 없을 수도 있지만 트랜잭션 만 가질 수 있습니다. 나는 이것을 매핑하는 가장 좋은 방법은 HasOne 매핑을 사용하는 것이라고 생각했다. 지금까지 모든 것이 좋지만 나는 당신이 이벤트를 삭제할 때 트랜잭션이 있으면 그것을 삭제하지 않을 것임을 확인하고 싶습니다.NHibernate - 1 대 1로 반대가 없음

일반적으로 HasMany 관계에서 나는 반전을 설정하고 캐스케이드를 없음으로 변경합니다. 캐스케이드가 존재하는 동안, Inverse는 트랜잭션을 가지고 있는지 여부에 관계없이 이벤트를 삭제합니다.

누군가가 나에게 올바른 방법을 보여줄 수 있다면 감사하겠습니다. 감사합니다

답변

3

당신은 항상 당신의 자신의 주문이 DeleteEventListener를 사용하여 동작을 삭제 만들 수 있습니다 :이 DeleteEventListener은 다음 NHibernate에 설정 구성의 일부로서 등록 될 필요가

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); 
    } 
    } 

. 세션 공장 요소 내에서 :

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

나는이 특정 코드를 테스트하지 않았습니다하지만 문제가 발생할 경우 내가 도울 수 있도록 내 응용 프로그램에서 비슷한 코드가 있습니다.

+0

감사합니다. 내 사건이 비즈니스 논리 요구 사항 일 가능성이 높기 때문에이 방법이 좋습니다. – nfplee

1

일대일이란 외래 키가 없지만 동기화 된 기본 키가 있음을 의미합니다. 즉, 이벤트의 기본 키는 트랜잭션에서 가져옵니다.

캐스케이드와 관련이 없습니다.

Inverse는 관계가 외래 키를 다른 관계와 공유 함을 나타냅니다. 예를 들어 목록 (일대 다)이 있으면 목록의 항목에서 해당 컨테이너에 대한 역 참조와 동일한 정보가 들어 있습니다. 따라서이 정보를 데이터베이스에 두 번 저장할 필요가 없으며 "역"으로 표시됩니다.

대부분의 경우, many-to-one이 올바른 선택입니다. AFAIK, 유창하게 "참고 문헌"이라고합니다.

+0

환호하지만 내 이벤트 거래에 대한 언급이 없습니다. nullable 필드를 넣고 참조를 사용할 수 있지만이 접근 방법에 관심이 없다고 생각합니다. 잠재적으로 내 데이터베이스 구조는 일대 다 시나리오를 허용하므로 HasMany는 내 이벤트가 하나의 트랜잭션 만 가질 수 있다는 사실이 비즈니스 요구 사항에 더 가깝다는 점에서보다 의미가 있습니다. 그러나 나는 여전히 하나의 엔티티가 아니라 목록을 반환하는 내 이벤트의 트랜잭션 속성을 선호합니다. – nfplee