Я использую Сравнить объекты .NET, чтобы проверить, правильно ли сохраняются мои POCO в тестовой базе данных. Возьмем пример POCO:
public class NoahsArk
{
public virtual Noah Noah { get; set; }
}
И файл сопоставления с использованием FNH:
public class NoahsArkMap : ClassMap<NoahsArk>
{
References(x => x.Noah).Cascade.All();
}
Теперь я запускаю этот код:
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() терпит неудачу, потому что видит noahsArk.Noah как объект Noah, а dbNoahsArk.Noah как прокси-объект NHibernate. Я не знаю, что NHibernate делает в фоновом режиме, потому что если я сделаю это вместо этого:
Assert.That(noahsArk.Noah, Is.EqualTo(dbNoahsArk.Noah));
Он отлично работает, хотя оба типа объектов различаются, если я использую GetType() на обоих. У меня вопрос: как сделать так, чтобы NHibernate «прозрачно» возвращал объект вместо прокси, когда я пытаюсь использовать с ним Compare .NET Objects? Или Compare .NET Objects несовместим с NHib?
Дополнительная информация:
Я использую Compare .NET Objects, поэтому мне не нужно писать тесты на равенство для каждого свойства. Мои POCO, вероятно, придется изменить, и это очень поможет, если у меня будет инструмент, который может проводить глубокие сравнения с использованием Reflection.
Кроме того, я знаю, что могу сделать свойство не ленивой загрузкой, используя это в моем классе сопоставления:
References(x => x.Noah).Not.LazyLoad().Cascade.All();
Но для меня это был бы последний вариант, потому что он устраняет преимущества ленивой загрузки.