У меня есть два простых класса с именем «Пользователь и роль» в проекте .Net Web Api.Fluent NHibernate Ссылки печать объекта «__interceptor» вместо объекта домена
Класс Пользователь:
public class User
{
public virtual int Id { get; set; }
public virtual int RoleId { get; set; }
public virtual string Name { get; set; }
public virtual Role Role{ get; set; }
public User() { }
}
А класс Роль является:
public class Role
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public Role() { }
}
Отображения с использованием свободно являются:
Пользователь:
public UserMap()
{
Table("plc_users");
Id(x => x.Id).Column("usr_id");
Map(x => x.RoleId).Column("rol_id");
Map(x => x.Name).Column("usr_name");
References(x => x.Role).Column("rol_id");
}
Роль:
public RoleMap()
{
Table("plc_roles");
Id(x => x.Id).Column("rol_id");
Map(x => x.Name).Column("rol_name");
}
Это односторонние отношения между пользователем и ролью. Пользователь имеет роль. Хотя роль может присутствовать у многих пользователей, в этом случае не представляется интересным представлять это в классе Role.
Когда я получаю пользователя из базы данных, свойство «Роль» получает неправильное значение. Оно должно быть:
{
"Id" : "2",
"RoleId" : "1",
"Name" : "Any",
"Role": {
"Id": "1",
"Name" : "Any"
}
}
Но это становится:
{
"Id" : "2",
"RoleId" : "1",
"Name" : "Any",
"Role": {
"__interceptor": {
"persistentClass": "NameSpaceForClass, , Version=1.0.0.0 [...]
"getIdentifierMethod": {
[...]
},
}
Наблюдая консоль для команд SQL, выполняемых NHibernate, не была названа команда для извлечения записи роли.
Итак, что мне здесь не хватает? Почему роль класса не правильно выбрана в соответствии с определением домена?
UPDATE:
Благодаря ответу Радим Келер, я понял, что проблема была не с Fluent NHibernate, но с «lazyloading сериализации прокси-ад».
После его советы, я обнаружил две новые ошибки:
Первое:
The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json; charset=utf-8'
И внутренний:
Could not initialize proxy - no Session.
Я использую сессию в рамках действия что означает, что сеанс начинается в начале действия и закрывается в конце. Исходя из этого, я начал несколько способов понять, почему сессия закрывалась до сериализации Json. Множество конфигураций позже, я заметил, что в режиме отладки все работает нормально. И это было странно.
Во всяком случае, я не получаю нигде, так что я решил выключить режим LazyLoad, как это:
References(x => x.Role).Column("rol_id").ReadOnly().Not.LazyLoad();
Это не решение. Но решает проблему, пока я застрял в выяснении, почему сеанс работает только в режиме отладки.
спасибо! Я сделал еще несколько отладок, и я понял, что проблема не в Fluent NHibernate вообще. Но, как вы сказали, с "lazyloading serialization proxy hell". Это привело меня к другим проблемам. Они описаны в «Обновлении» этого вопроса. –