2013-12-21 3 views
2

내가 부모 클래스 인 hbm.xml에 Child 클래스의 일대 다 집합이 있다고 가정 해 보겠습니다. 주어진 부모의 모든 자식을 가능한 한 효율적으로 삭제하려고합니다.NHibernate에서 관련된 세트의 모든 요소를 ​​삭제하는 방법?

foreach (var child in parent1.Children) 
    session.Delete(child); 
parent1.Children.Clear(); 

이 3+ 다른 SQL 문에서 결과 : 모든 어린이의 외래 키를 설정하는 UPDATE 다음에 아이 엔티티를 가져 오는 SELECT가에 기초 NULL로 이것은 내가 지금 뭘하는지입니다 부모 외래 키, 여러 DELETE 문 다음에 하나씩.

내가보고 싶은 것은 상위 외래 키를 기반으로 모든 하위를 삭제하는 하나의 DELETE입니다. 거기에 NHibernate 방법이 있나요? 아니면 총알을 물고 원시 SQL 문을 발행해야합니까?

답변

3

NHibernate는 매우 멋진 기능을 도입했습니다 : 13.3. DML-style operations.

이 한 두 자 NHibernate/SQL 기능을 지원합니다

  1. 위에 HQL을 사용하여 매핑 모델 쓰기 작업을 수행
  2. (우리가/POCO 모델 우리의 엔티티로 작업) 직접 서버 (응용 프로그램 서버에 데이터를 다운로드)에

문서, 표준에서 예를 조정 위의 ioned :

ISession session = sessionFactory.OpenSession(); 
ITransaction tx = session.BeginTransaction(); 

String hqlDelete = "delete Children c where c.ParentId = :parentId"; 

int deletedEntities = s.CreateQuery(hqlDelete) 
     .SetString("parentId", parentId) 
     .ExecuteUpdate(); 
tx.Commit(); 
session.Close(); 

니스 읽기 : Ayende: NHibernate – Executable DML

+0

자식 개체는 부모 속성이 없습니다, 그것은 하나 hbm.xml에 매핑되지 않습니다. 연결은 부모에서만 정의됩니다. 부모 관점에서이 삭제 작업을 수행 할 수 있습니까, 아니면 inverse many-to-one 연관도 매핑해야합니까? – fejesjoco

+0

나는 여러 번 논의 했으므로, 우리는 하위 엔티티에 ParentId를 매핑해야한다고 거의 확신했다. 첫째로 ... 그것은 아이 테이블에 있습니다. 그래서 그것은 자연에 의해 아이에게 속합니다. 둘째, 많은 이점을 제공합니다. DML; 우리는 여전히 WRITE 연산을 줄일 수 있습니다 (예 : Parent를 단지 읽기 전용으로 만들기'insert/update = "false"'). protected setter ... 등으로'ParentId' 프로퍼티를 만들 수 있습니다. 많은 자유를 얻었습니다 (우리는 지금 서브 쿼리를 할 수 있습니다) –

관련 문제