У меня есть что-то вроде этого:
public class Account
{
public virtual int Id { get; private set; }
public virtual string Username { get; set; }
[EditorBrowsable( EditorBrowsableState.Never )]
public virtual string Password { get; private set; }
public void SetPassword( string password ){ ... }
public bool CheckPassword( string password ) { ... }
}
Я настроил это так, потому что никогда не хочу, чтобы свойство Password
использовалось непосредственно в коде, который использует тип Account
. Карта аккаунта выглядит примерно так:
public class AccountMap : ClassMap<Account>
{
public AccountMap()
{
Id( x => x.Id );
Map( x => x.Username );
Map( x => x.Password );
}
}
Когда я на самом деле использую это с NHibernate, я получаю InvalidProxyTypeException
NHibernate.InvalidProxyTypeException: The following types may not be used as proxies:
Fringine.Users.Account: method SetPassword should be virtual
Fringine.Users.Account: method CheckPassword should be virtual
Я понимаю, что NHibernate пытается создать прокси-класс для поддержки отложенной загрузки и что я могу либо пометить методы как виртуальные, добавить Not.LazyLoad () на карту, чтобы устранить исключение. Но я не хочу делать ни то, ни другое. Я хочу поддерживать отложенную загрузку, но не понимаю, почему эти методы должны быть виртуальными.
Оценивает ли NHibernate (или Castle внутри) содержимое метода, чтобы определить, какие поля используются, и оптимизировать отложенную загрузку для этих свойств? Если нет, то почему метод должен быть виртуальным, если все свойства есть, и они будут загружаться лениво, когда на них ссылается метод.
Есть ли способ исключить определенные методы из виртуального требования?