2011-02-28 3 views
3

날 매핑을 보여주는 시작하자 삭제 :NHibernate에 캐스케이드

부모 :

<bag name="Communicatiekanalen" table="COMMUNICATIEKANAAL" inverse="true" cascade="delete" lazy="true" > 
     <key column="SEK_PROFIEL"/> 
     <one-to-many class="Crm.Hibernate.Communicatiekanaal,Crm.Hibernate" /> 
</bag> 

아이 : 즉

<many-to-one name="SekProfiel" column="SEK_PROFIEL" class="Crm.Hibernate.Profiel,Crm.Hibernate" /> 

: 프로필 많은 의사 소통을 할 수 있습니다 채널. 인터페이스에서

(사용자 인터페이스 [ASP.NET 웹 양식]) 다음 이벤트는 (첨부 통신 채널 프로파일 삭제)

var profielDao = CrmConfiguration.GetDaoFactory().GetProfielDao(); 
    var profiel = profielDao.GetById(2194, true); //lets say '2194' is an ID that exists 
    profielDao.Delete(profiel); 

가합니다 (DaoFactory가 위치를 하나의 프로젝트 파일에 UI가 ASP.NET 웹 사이트입니다.

이 코드는 작동합니다.

중요 : 코드는 NHibernate 'open-session-in-view'패턴을 사용하고 있습니다.

통신 채널을 사용하여 프로필을 삭제하면 동일한 코드가 실행되는 서비스 구현이 있습니다. 일부 코드 ...

  var daof = CrmConfiguration.GetDaoFactory(); 
      CrmSettings.Instance.UserID = user; 
      var profielDao = daof.GetProfielDao(); 

      profielDao.BeginTransaction(); 
      var profiel = profielDao.GetById(CrmEntitiesToHibernate.ParseStringToId(profileId), true); 
      profielDao.Delete(profiel); 
      profielDao.EndTransaction(); 

여기서 'EndTransaction()'은 '커밋'을 수행합니다. 이 코드를 '단위 테스트'로 테스트합니다.

[TestMethod] 
    public void TestDeleteProfile() 
    { 
     //Getting a valid NEW profile 
     var profile = GetSecundaryProfile(); 
     //Adding a communication channel to the profile 
     CrmClient.AddCommunicationChannelForProfile(GetPlainCommunicationChannel(), profile.Id, CurrentUserId); 
     //Calling the 'delete profile' method on the service --> FAIL - no cascade 
     CrmClient.DeleteProfile(profile.Id, CurrentUserId); 
    } 

이 코드는 실패합니다. 다음 오류가 보채된다

참조 제약 조건 "R2_PROFIEL"와 충돌 DELETE 문. "CRM_ontw"테이블 "dbo.COMMUNICATIEKANAAL", 'SEK_PROFIEL'테이블에서 충돌이 발생했습니다. 성명은 종료되었습니다.

이것은 계단식 현상이 전혀 일어나지 않았 음을 의미합니다. UI에서 실행됩니다. 으로 작동하지만 '서비스 구현'에서 실행되면 으로 실패합니다. 나에게 도움이 될만한 아이디어 나 제안이 있으십니까? 사전


편집에

감사 : 다음과 같은 일반적인 코드 삭제는 all-delete-orphan 문제가 해결되지 않는 설정 객체

public void Delete(T entity) 
    { 
     try 
     { 
      OnDelete(entity); 
     } 
     catch (Exception) 
     { 
      SessionManager.Instance.RollbackTransactionOn(SessionFactoryConfigPath); 
      throw; 
     } 
     session.Delete(entity); 
    } 

입니다.cascade="delete" 또한

cascade="all-delete-orphan"에, 두 경우 모두에서 다음을 확인 설정

+0

'profielDao.Delete (profiel)'의 구현 기능 : 약간의 비틀기와 그래서

나는이 EndTransaction() 방법을 만들어? –

답변

0

봅니다, 부모는 이 같은 ISession 인스턴스에 의해를 저장 읽고있는. 다른 사람이 언급 한대로 .Delete() 메소드 구현을 확인해야합니다.

+0

FK에 DELETE CASCADE 옵션을 적용하십시오. – Genius

2

문제점을 발견했습니다. NHibernate에 '오픈 세션에서 뷰'패턴 데이터베이스 (요청이 종료 그렇게 할 때, 세션이 종료됩니다)에 변경 사항을 커밋 한 후에 세션을 닫습니다 :

 finally 
     { 
      // No matter what happens, make sure all the sessions get closed 
      foreach (SessionFactoryElement sessionFactorySettings in openSessionInViewSection.SessionFactories) 
      { 
       SessionManager.Instance.CloseSessionOn(sessionFactorySettings.FactoryConfigPath); 
      } 
     } 

하지만 서비스 측면에 내 EndTransaction() 구현 하지 않았다.

public void EndTransaction() 
{ 
    try 
    { 
     SessionManager.Instance.CommitTransactionOn(SessionFactoryConfigPath); 
    } 
    finally 
    { 
     SessionManager.Instance.CloseSessionOn(SessionFactoryConfigPath); 
    } 
}