Как сравнить объект с прокси-объектом NHibernate? - PullRequest
1 голос
/ 19 ноября 2009

Я использую Сравните .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();

Но это был бы последний вариант для меня, потому что это устраняет выгоду от ленивой загрузки.

Ответы [ 2 ]

4 голосов
/ 19 ноября 2009

Я считаю, что вам нужно переопределить GetHashCode и Equals в ваших сущностях.

1 голос
/ 19 ноября 2009

Сравните. NET Objects делает правильные вещи, так как экземпляры различаются (типы разные, это прокси, как вы говорите сами).

То, что нам нужно было сделать в проекте, в котором несколько лет назад использовался NHibernate, было реализовать наш собственный GetUnderlyingType () (имя, украденное из класса Enum) для нашей сущности "слой супертипа".

GetUnderlyingType () просто возвращает тип базового класса, если это прокси.

Этот метод затем использовался в нашем методе Equals () вместо GetType () (как используется в учебнике, R # и т. Д.).

...