Как получить тип сущности для объекта, который может быть прокси-объектом NHibernate?

У меня есть базовый классDomainObject для всех моих бизнес-объектов, которые я использую с NHibernate. Он содержитId имущество.

public abstract class DomainObject
{
    public virtual int Id { get; private set; }
}

Я хотел бы написатьIEqualityComparer сравнить мои доменные объекты. Если два объекта имеют одинаковыеId и являются одинаковыми объектами, они должны быть равны. Однако, когда я используюGetType() чтобы получить тип объекта, он вернет тип прокси NHibernate. Итак, этот код:

bool IEqualityComparer.Equals(object x, object y)
{
    // null checking code skipped here
    if(x is DomainObject && y is DomainObject)
    {
            return ((DomainObject) x).Id == ((DomainObject) y).Id
                    && x.GetType() == y.GetType();
    }
    return x.Equals(y);
}

Не работает правильно, потому что типx is Asset но типy is AssetProxy21879bba3e9e47edbbdc2a546445c657.

Итак, как мне получить тип сущности для объекта, который может быть прокси-объектом NHibernate? то есть в приведенном выше примереAsset вместоAssetProxy21879bba3e9e47edbbdc2a546445c657?

 Mauricio Scheffer21 сент. 2010 г., 00:22
Я на 99% уверен, что это дубликат, но сейчас мне лень его искать :-)
 Jeff Walker Code Ranger21 сент. 2010 г., 05:45
Пожалуйста, покажите мне тот, который он дублирует, я искал все это через stackoverflow.

Ответы на вопрос(4)

Решение Вопроса

Вы можете получить реальный тип прокси с:

NHibernateUtil.GetClass(x);

или вы можете добавить методDomainObject лайк:

public virtual Type GetTypeUnproxied()
{
    return GetType();
}

Который действительно гладкий и не зависит напрямую от NHibernate.

В качестве альтернативы можно подойти к проблеме, сказав, что вам нужно получить истинный объект, а не прокси-сервер, который, если сеанс удобен, можно выполнить с помощью:

session.PersistenceContext.Unproxy(x);

Как уже упоминалось в другом ответе, если вы пытаетесь реализовать равные, было бы неплохо проверитьЧеткая архитектура реализации Equals.

 Jonas Stensved10 февр. 2012 г., 16:46
Обратите внимание, что если вы используете Castle Windsor, GetClass может вернуть тип Proxy. Посмотрите эту тему для другого способа ее решения:stackoverflow.com/a/1420816/348841

я взял другой подход в производственном проекте. У меня просто есть глобальный HiLow Id-Generator, который генерирует уникальный идентификатор для всех типов, тогда я могу:

// in DomainEntity
public override bool Equals(object obj)
{
    var other = obj as DomainEntity;
    if (Id == 0) // IsTransient()
        return ReferenceEquals(this, other);
    else
        return (other != null) && (Id == other.Id);
}

// Comparer
bool IEqualityComparer.Equals(object x, object y)
{
    return object.Equals(x, y);
}

Чтобы получить реальный объект вместо прокси вы можете использовать

session.PersistenceContext.Unproxy(proxyObject)

Но я думаю, что вы должны смотреть наРеализация архитектуры Sharp для равных.

 Jeff Walker Code Ranger21 сент. 2010 г., 21:11
В этом случае у меня фактически нет сессии, доступной мне в этом коде. Спасибо за ссылку на Equals в архитектуре Sharp, она не применима ко мне, потому что я пишу equals для тестов, поэтому она не должна обрабатывать все случаи, но она все еще была хорошей ссылкой. И спасибо Дэну за ссылку на код GetTypeUnproxied (), это больше, чем я заинтересован.
 DanP21 сент. 2010 г., 12:13
Следует отметить, что он, вероятно, более заинтересован в методе GetTypeUnproxied () вgithub.com/codai/Sharp-Architecture/blob/master/src/SharpArch/... - но +1 для хорошей ссылки вкл.

Вот чтобы получить фактический незафиксированный экземпляр.

Ваш ответ на вопрос