Я бы сказал, что это проблема дизайна на мой взгляд. Поскольку NH устанавливает соединения с базой данных под всеми и имеет посредники в середине, для прозрачности вашего приложения нецелесообразно напрямую сериализовать их (и, как вы можете видеть, Json.NET их совсем не любит).
Вы не должны сериализовать сами сущности, но вы должны преобразовать их в объекты «просмотра» или объекты POCO или DTO (как вы хотите их называть), а затем сериализовать их.
Разница в том, что, хотя сущность NH может иметь прокси, ленивые атрибуты и т. Д. Объекты представления являются простыми объектами с только примитивами, которые по умолчанию сериализуемы.
Как управлять ФК?
Мое личное правило:
Уровень сущности: класс Person и связанный с ним класс Gender
Уровень просмотра: представление «Лицо» со свойствами GenderId и GenderName.
Это означает, что вам нужно расширять свои свойства в примитивы при конвертации для просмотра объектов. Таким образом, ваши объекты json становятся проще и проще в обращении.
Когда вам нужно отправить изменения в БД, в моем случае я использую AutoMapper и создаю класс ValueResolver, который может преобразовать ваш новый Guid в объект Gender.
ОБНОВЛЕНИЕ: Отметьте http://blog.andrewawhitaker.com/blog/2014/06/19/queryover-series-part-4-transforming/, чтобы узнать, как напрямую получить представление (AliasToBean) от NH. Это было бы усилением на стороне БД.