날 매핑을 보여주는 시작하자 삭제 :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"
에, 두 경우 모두에서 다음을 확인 설정
'profielDao.Delete (profiel)'의 구현 기능 : 약간의 비틀기와 그래서
나는이EndTransaction()
방법을 만들어? –