내 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();
을하지만 게으른 로딩의 효과를 제거하기 때문에 그것은 나를 위해 마지막 옵션이 될 것입니다 :
또한, 나는 내 매핑 클래스에서이를 사용하여 속성이 아닙니다 게으른 부하를 만들 수 있습니다 알고 있습니다.
.NET 개체를 비교하는 것이 그 것이므로 모든 POCO에서 재정의 할 필요가 없으며 POCO가 변경 될 때마다 업데이트해야합니다. –
나는 Fluent NHibernate가 정말 좋기 때문에 답변을 올바른 것으로 표시했다. :) 좋은 일을 계속하십시오! –