2

문을 소유 한 Car 엔티티가 있습니다. 자동차가 삭제되면 문을 지워야합니다. 왜냐하면 자동차가 스스로 이해할 수 없기 때문입니다. FluentNibernate의 매핑은 다음과 같습니다. 이 방법으로 차를 삭제할 때FluentNHibernate가 AllDeleteOrphan이 있어도 하위 엔티티를 삭제하지 않음

public void Delete(Car car) 
{ 
    using (ISession session = NHibernateHelper.OpenSession()) 
    using (ITransaction transaction = session.BeginTransaction()) 
    { 
     session.Delete(car); 
     transaction.Commit(); 
    } 
} 

그러나, 문이 삭제되지 않고 carId는 NULL 드 넣어 :

public class CarMap : ClassMap<Car> 
{ 
    public CarMap() 
    { 
     Id(x => x.CarId).GeneratedBy.Assigned(); 
     HasMany(x => x.Doors).Cascade.AllDeleteOrphan(); 
    } 
} 

public class DoorMap : ClassMap<Door> 
{ 
    public DoorMap() 
    { 
     Id(x => x.DoorId); 
     References(x => x.Car); 
    } 
} 

CarDao 내부의 삭제 방법은 같습니다. 나는 Cascade.AllDeleteOrphan()이 아이들 (Doors) 삭제를 처리 할 것이라고 생각했습니다. 내가 여기에 누락 뭔가처럼 그것을 삭제하기 전에 개체를 얻을 수있는 권리를 생각하지 않기 때문에,

public void Delete(Car car) 
{ 
    using (ISession session = NHibernateHelper.OpenSession()) 
    using (ITransaction transaction = session.BeginTransaction()) 
    { 
     var entity = session.Get<Car>(car.CarId); 
     if (entity != null) 
     { 
      session.Delete(entity); 
      transaction.Commit(); 
     } 
    } 
} 

I 느낌 : 나는이에 대한 삭제 방법을 재 작업해야했다. 이견있는 사람?

답변

2

각 요청에 대해 세션을 인스턴스화하고 처리합니다. 첫 번째 Delete 메서드에서 인스턴스화 된 세션은 원래 전달한 Car 개체를로드 한 세션과 동일하지 않으므로 Car 객체 삭제를 요청할 때 삭제하기 위해 Door 개체에 대한 참조가 없습니다.

두 번째 방법에서는 세션이 Car를로드하므로 자식 개체에 대한 참조가 있으므로 (심지어 자식 개체가 완전히로드되지 않아도 nHibernate가 프록시를로드하더라도) 해당 세션이 삭제를 계단식으로 계단식 연결하도록 허용합니다. 자동차를 지울 때의 물건.

응용 프로그램에 따라 세션은 더 높은 수준에서 회전되어 여러 트랜잭션에서 사용되어야합니다. 각각의 모든 트랜잭션에 대해 Session을 생성하고 처리하는 것은 불필요한 오버 헤드입니다.

난 당신이 nHibernate 수의 세션 관리에 대한 다음 게시물의 읽기을 추천 할 것입니다 :

http://nhforge.org/blogs/nhibernate/archive/2011/03/03/effective-nhibernate-session-management-for-web-apps.aspx

+2

수정. 마지막 단락은 http://nhforge.org/doc/nh/en/index.html#example-parentchild-cascades에서 확인하십시오. * 참고 : 컬렉션 매핑에서 inverse = "true"를 지정하더라도 컬렉 션 요소를 반복하여 계단식을 계속 처리합니다. 따라서 개체를 저장, 삭제 또는 캐스케이드로 업데이트해야하는 경우 개체를 컬렉션에 추가해야합니다. 단순히 부모를 설정하는 것만으로는 충분하지 않습니다. * –

+0

@ pobed2 질문에 대한 답변이 있습니까? – CSL

+0

예. 나는 NHibernate에 대한 몇 가지 개념을 오해 한 것으로 생각하고 올바른 방향으로 이끌었다. 감사! – pobed2