Я считаю, что это требуется для функции отложенной загрузки в NHibernate, где NHibernate создает прокси вашей сущности и контролирует весь доступ к ней. Вот почему каждый метод и свойство должны быть виртуальными. По сути, если есть член, который что-то делает с сущностью, NH должен знать об этом и подключиться к нему.
Как упоминалось ранее, для того, чтобы NHibernate выполнял «магию», он создает прокси-классы, которые наследуются от ваших сущностей (в вашем случае Category). Однако, если вы заставите ваши сущности реализовать интерфейс, он будет использовать этот интерфейс для создания прокси вместо конкретных типов. Таким образом, вам не придется отмечать все виртуально.
РЕДАКТИРОВАТЬ: Некоторые исправления ... Согласно this , я вынужден сказать, что кажется, что NH на самом деле ничего не делает с виртуальными методами, в конце концов. И я даже читал, как кто-то говорил, что они убрали эту проверку времени выполнения из сборки ядра NH, чтобы обойти это. Я предполагаю, что это старые требования, которые не были удалены. Круто то, что похоже, что есть инициатива использовать PostSharp для статических прокси, поэтому вашим классам не нужно будет объявлять что-либо виртуальное, чтобы NH генерировал прокси. Плохо то, что, похоже, он застрял в ветке почти два года.