1

내 POCO가 테스트 데이터베이스에 올바르게 유지되는지 테스트하려면 Compare .NET Objects을 사용하고 있습니다. 이 같은 noahsArk.Noah을 볼 수 있기 때문에어떻게 객체를 NHibernate 프록시 객체와 비교합니까?

var noahsArk = new NoahsArk { new Noah() }; // create a new ark 
var dbNoahsArk = database.SaveAndLoad(noahsArk); // saves the ark to the db and loads it again into another object 
Assert.That(new CompareObjects().Compare(noahsArk, dbNoahsArk), Is.True); // will return true if all properties (including collections) are equal 

Assert()은 실패의이 예 POCO을 보자 :

public class NoahsArk 
{ 
    public virtual Noah Noah { get; set; } 
} 

그리고 매핑 파일을 FNH 사용 :

public class NoahsArkMap : ClassMap<NoahsArk> 
{ 
    References(x => x.Noah).Cascade.All(); 
} 

을 지금, 나는이 코드를 실행 Noah 개체이지만, NHibernate 프록시 개체로는 dbNoahsArk.Noah입니다. 나는 모두 GetType()을 할 경우, 두 객체의 종류가 다르다하더라도, 그것은 잘 작동

Assert.That(noahsArk.Noah, Is.EqualTo(dbNoahsArk.Noah)); 

: 나는이 대신하는 경우에 때문에 NHibernate에 백그라운드에서 무엇을하고 있는지 모른다. 내 질문은, 어떻게 NHibernate 내가 그것을 투명하게 '대신 .NET 개체를 비교하려고 프록시 대신 개체를 반환 할 수 있도록 만들 수 있습니까? 또는 NHib와 호환되지 않는 .NET 객체를 비교합니까?

추가 정보 : 나는 그래서 모든 속성에 대한 평등 테스트를 작성하지 않아도 된 개체 .NET을 비교 사용하고

. 내 POCO는 변경해야 할 가능성이 높으며 Reflection을 사용하여 깊은 비교를 할 수있는 도구가 있으면 크게 도움이 될 것입니다.

References(x => x.Noah).Not.LazyLoad().Cascade.All(); 

을하지만 게으른 로딩의 효과를 제거하기 때문에 그것은 나를 위해 마지막 옵션이 될 것입니다 :

또한, 나는 내 매핑 클래스에서이를 사용하여 속성이 아닙니다 게으른 부하를 만들 수 있습니다 알고 있습니다.

답변

4

엔티티에서 GetHashCodeEquals을 무시해야한다고 생각합니다.

+0

.NET 개체를 비교하는 것이 그 것이므로 모든 POCO에서 재정의 할 필요가 없으며 POCO가 변경 될 때마다 업데이트해야합니다. –

+0

나는 Fluent NHibernate가 정말 좋기 때문에 답변을 올바른 것으로 표시했다. :) 좋은 일을 계속하십시오! –

1

.NET 개체는 인스턴스가 다르므로 올바른 작업을 수행합니다 (유형이 다르므로 사용자가 직접 말하는 것처럼 프록시입니다).

몇 년 전에 NHibernate를 사용했던 프로젝트에서 우리 엔티티 "layer super type"에 대한 GetUnderlyingType() (Enum 클래스에서 이름을 도난 당함)을 구현했습니다.

GetUnderlyingType()은 프록시 인 경우 기본 클래스 유형을 반환합니다.

그런 다음이 메서드는 GetType() 대신 Equals() 메서드에서 사용되었습니다 (텍스트 북, R # 등에서 사용 된 메서드).

+1

맞습니다. .NET 객체 비교를위한 소스를 다운로드하고 GetType() 등호 검사를 비활성화하여 문제를 해결했습니다. 이것은 당신이 같은 타입을 전달해야한다는 것을 의미합니다. 그렇지 않으면 어떤 시점에서 예외가 발생하지만, POCO를 비교하는 데만 사용한다는 점을 감안할 때 저는 그와 함께 살고 있습니다. –

+0

구현 방법은 다음과 같습니다. http://stackoverflow.com/questions/2664245/identifying-nhibernate-proxy-classes/2666395#2666395 –