Если вы указываете, что ленивая загрузка на уровне класса не должна использоваться (то есть NHibernate не должен создавать прокси для ваших объектов), то вам не нужно делать все ваши свойства виртуальными.
По умолчанию NHibernate создает прокси при получении экземпляра вашей сущности из БД. То есть он возвращает «пустой» объект, для которого заполнено только поле Id.
Только когда вам нужно какое-либо другое свойство этого объекта, сам объект извлекается.
Если вам не нужно это поведение, вы можете отключить его, указав 'lazy = false' на уровне класса.
С файлом отображения hbm вы делаете это так:
<class name="MyClass" table="sometable" lazy="false">
</class>
Но я не знаю, как это сделать на беглом языке; Я еще не играл с беглым.
редактирование:
В любом случае, NHibernate должен иметь способ установить поле. Для этого у вас есть 2 варианта:
- Первый вариант - это решение, которое вы уже предоставили, предоставив частный сеттер
Второй вариант - не использовать автоматические свойства, а создать свою собственность следующим образом:
public class MyClass
{
private int _id;
public int Id { get { return _id; } }
}
Затем в вашем отображении вы должны определить, что NHibernate должен использовать поле поддержки вместо свойства при установке его значения.
В файле отображения hbm вы делаете это так:
<property name="Id" column="columnname" access="field.camelcase-underscore" />
Как видите, вы указываете, что NHibernate должен использовать это поле и что он может найти поле, применяя данную стратегию именования. (В этом случае поле имеет то же имя, что и свойство, но перед ним стоит знак подчеркивания, и оно написано в регистре верблюдов (первый символ в нижнем регистре).
(Для удостоверения личности это также должно работать:
<id name="Id" column="..." access="field.camelcase-underscore" />
<generator ... />
</id>
Чтобы отобразить поля вместо свойств, вам просто нужно определить
access="field"
в файле сопоставления. Но опять же, я не знаю, как это сделать с помощью Fluent ... Думаю, мне срочно нужно взглянуть на Fluent.
редактирование:
Хорошо, я скачал свободно. :)
Разве нельзя сделать это так:
public class FooMap : ClassMap<Foo>
{
public FooMap()
{
Id( x => x.Id).Access.Field ();
}
}