Неожиданные прокси-объекты в Nhibernate с составными идентификаторами - PullRequest
1 голос
/ 12 января 2009

У меня есть структура данных, которая использует составные идентификаторы (которые я не хочу менять на одиночные) Все загружается нормально, за исключением объединений «многие-к-одному», которые, если соединение пустое, вместо сопоставления свойства со значением null, сопоставляют его с пустым прокси-объектом. Я написал некрасивую работу вокруг (см. Ниже). Какие-нибудь решения для этого?

частный узел _Parent;

    public Node Parent
    {
        get
        {
            return this._Parent;
        }
        set
        {
            this._Parent = Proxy.Check<Node>(value);
        }
    }
internal static class Proxy
{
    public static T Check<T>(T obj) where T : PersistentObject
    {
        if (obj is NHibernate.Proxy.INHibernateProxy && obj != null)
        {
            try 
            {
                int id = obj.ID;
                return obj;             
            }
            catch //Proxy only object cant retrieve ID
            {
                return null;
            }
        }
        else
        {
            return obj;
        }
    }

}

с началом файла отображения

<class name="Node" table="Node">
    <composite-id>
        <key-property name="ID"/>
        <key-property name="VersionID"/>
    </composite-id>

и доступ

    <many-to-one name="Node" class="Node" >
        <column name="NodeID"/>
        <column name="VersionID" />
    </many-to-one>

1 Ответ

2 голосов
/ 23 июня 2009

Не совсем уверен, что это идеальное решение для этой ситуации, но это исправило проблему для меня, когда я столкнулся с той же проблемой при работе на старой БД с составными ключами.

Установив not-found, чтобы игнорировать в ваших ссылках, NHibernate будет обрабатывать пустые объекты как пустые вместо исключений. При использовании этого метода NHibernate выполнит отдельный запрос, поэтому возможны небольшие потери производительности, так как это в основном требует загрузки объекта.

Вы можете просто попытаться загрузить объект, вместо того чтобы использовать эту технику, но у меня есть ощущение, что он вернет исключение, как если бы он ожидал объект (не ноль). Я бы предложил опубликовать вопрос на форумах NHibernate, если это не сработает, поскольку я определенно не являюсь экспертом в этой области, но для вас это может быть меньшая / менее уродливая работа.

Например:

<many-to-one name="Node" class="Node" not-found="ignore">
    <column name="NodeID"/>
    <column name="VersionID" />
</many-to-one>

Надеюсь, это поможет,

Jay

...