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

У меня есть базовый класс 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?

Ответы [ 4 ]

22 голосов
/ 21 сентября 2010

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

NHibernateUtil.GetClass(x);

или добавить метод к DomainObject, например:

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

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

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

session.PersistenceContext.Unproxy(x);

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

2 голосов
/ 21 сентября 2010

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

session.PersistenceContext.Unproxy(proxyObject)

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

0 голосов
/ 07 декабря 2011

Я взял другой подход в производственном проекте.У меня просто есть глобальный 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);
}
0 голосов
/ 21 сентября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...