2011-02-03 4 views
0

Я видел в некоторых примерах NHibernate, что используется абстрактный класс сущностных сущностей, который переопределил Equals, GetHashCode, обрабатывать переходные объекты, прокси-объект (в ленивом сценарии загрузки .. я думаю) ,NHibernate и создание абстрактного базового класса сущности

Действительно ли необходимо реализовать такой абстрактный базовый класс сущности для получения всех моих сущностей?

ответ

1

Если вы хотите заниматься ленивой загрузкой, обязательно требуется равное равное. Это потому, что NHibernate полагается на метод Equals для определения равенства. По умолчанию используется ссылочное равенство.

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

Следовательно, для вашего приложения, чтобы признать, что прокси-объект совпадает с объектом, он предназначен для реального экземпляра - он вообще не должен знать прокси-объект.

Таким образом, вы должны переопределить оператор Equals, чтобы разумно распознать равенство (после проверки ссылочного равенства ... и т. Д.), Что объекты равны, если их идентификаторы равны.

+0

У меня возникает проблема с методом ISet's Remove() после переопределения Equals, GetHashCode. Пожалуйста, см. Это сообщение: http://stackoverflow.com/questions/5040043/nhibernate-iesi-iset-fails-to-remove. –

2

Не нужно вообще. Это просто упрощает работу, потому что вы можете накладывать на него такие вещи, как Id. Также есть общая функциональность, как вы ранее упоминали как Equals/GetHashCode.

2

Да, сам базовый класс не является обязательным, но наиважнейшим Равно и GetHashCode является то, что вы хотите сделать на все лицо, поэтому базовый класс делает это намного меньше repetetive

2

По моему опыту, имеющий базовый класс, который предоставляет свойство Id, действительно полезен для создания общих методов репозитория, которые используют это преимущество, или для автоматических соглашений о сопоставлении.

Преодоление равных, однако, является другой историей.

Это приводит к загрузке неинициализированных прокси, когда вы их сравниваете (например, вызывая Distinct на последовательности). По этой причине это лучше сделать только для иерархии классов редко меняющихся объектов, которые могут быть кэшированы.

+0

Я должен согласиться с diego здесь, я использую базовый абстрактный класс исключительно для своего поля Id. – Rippo

+0

Я столкнулся с проблемой в методе Remove() ISet после того, как переопределил Equals, GetHashCode. Пожалуйста, см. Это сообщение: http://stackoverflow.com/questions/5040043/nhibernate-iesi-iset-fails-to-remove –

Смежные вопросы