2017-04-09 10 views
0

여기NHibernate에 일관성이 가져 오는 행동

if (des.X == null) 
{ 
    if (src.IsL) 
    { 
     des.X = new Y(); 
     var l = lRepo.Find().Where(file => file.Id == src.drId).First(); 
     ((Y)des.X).L = l; 
    } 
    else 
    { 

     D d = dRepo.Get(src.DrugId); 
     if (d is N) 
     { 
      des.X = new Y(); 
      ((Y)des.X).D = d; 
      ((Y)des.X).L = ((N)d).L; 
     } 
     else 
     if (d is IF) 
     { 
      des.X = new IeI(); 
      des.X.D = d; 
     } 
    } 
} 
내가 만들고 요청을 보내고 나는 N 아이디 보낼 때 나는 처음에 if (d is N)

을 요청하는 경우 문제가 발생

, 그것은 평가 내 코드입니다 그것은 사실이지만 업데이트 할 때 같은 데이터를 보내면 false로 평가합니다.

저는 약간 혼란스럽고 그것에 대한 논리적 인 설명이 없으므로 아무도이 문제를 해결할 수 있도록 도와 줄 수 없습니다.

업데이트 할 때 프록시를 반환하지만 생성시 일반 엔터티를 반환합니다.

이 경우에는 Untrack 및 지연로드 솔루션이 작동하지 않지만 효율적인 솔루션이라고 생각하지 않습니다.

도움주세요.

답변

1

아마도 매핑 된 기본 클래스의 프록시를 얻고있을 것입니다. 기본 클래스에서 파생 된 것이지 구체적인 클래스에서 파생되지 않으므로 형식 테스트가 실패하게됩니다.

모델에 대한 자세한 내용이 없으면 최악의 해결책을 제안 할 수 있습니다. (. 그것은 당신이 예상 구체적인 유형에 대한 기본 클래스 프록시의 유형을 테스트 처리해야 상황에서되지 않도록하는 것이 바람직 할 것이다) 당신의 기본 클래스에서

를이 추가 :

public virtual Type GetUnproxiedType() 
{ 
    return GetType(); 
} 

변경 테스트가로 :

if (typeof(NonInfantDrugRegistration).IsAssignableFrom(
    drugRegistration.GetUnproxiedType())) 

NHibernate에 프록시 메서드와 속성에 대한 호출을 리디렉션하기 때문에이 일을해야는 ID와 객체 유형 (및 일부 기타)에 속하는 방법을 제외. 호출을 리부팅 할 첫 번째 호출에서 동적으로 만들고로드 할 구체화되지 않은 인스턴스로 호출을 리디렉션합니다. 이 구체화 된 인스턴스는 프록시가 아니며 예상되는 유형을 갖습니다. 따라서 위의 GetUnproxiedType 메소드는 비인증 NonInfantDrugRegistration으로 리디렉션되고 구체적인 유형이 반환됩니다.