Я использую Сравните .NET Objects , чтобы проверить, правильно ли сохранены мои 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 «прозрачно» возвращал объект вместо прокси, когда я пытаюсь использовать с ним Сравнение .NET Objects? Или объекты сравнения .NET несовместимы с NHib?
Дополнительная информация:
Я использую Compare .NET Objects, поэтому мне не нужно писать тесты на равенство для каждого свойства. Мои POCO, вероятно, придется изменить, и это очень поможет, если у меня будет инструмент, который может делать глубокие сравнения с помощью Reflection.
Кроме того, я знаю, что могу сделать свойство не ленивым, используя это в моем классе отображения:
References(x => x.Noah).Not.LazyLoad().Cascade.All();
Но это был бы последний вариант для меня, потому что это устраняет выгоду от ленивой загрузки.