Игнорирование методов на объекте вводит с nHibernate

Если Ваши потребности кода, ускоряющие тогда возможности, состоят в том, что Ваш набор тестов делает также. Этот разговор затрагивает ключевые пункты:

Турбо Заряженные Наборы тестов

9
задан Paul Alexander 13 July 2009 в 16:30
поделиться

3 ответа

The reason is that you could access fields in your methods, which will not be initialized. So the easiest way is to load the contents of the entity on any call to the object (the only exception is the access to the id, which is already available in the proxy).

So you can safely implement your methods as if there weren't proxies - with the trade-off that the method needs to be virtual (which - I agree - is not perfect).

If you think that this is a problem for your class design, try to move the functionality to another class (eg. PasswordManager, PasswordValidator etc). This class will aggregate the Account or take it it as argument, so the Account will only be loaded when this class actually calls one of its properties.

7
ответ дан 4 December 2019 в 23:07
поделиться

Я заметил, что NHibernate в значительной степени полагается на POCO для всех своих объектов . Хорошо это или плохо, я не встречал ни одного сценария, когда кто-то нарушал бы это соглашение. Дэви Брион объясняет это здесь очень подробно. (Он ссылается на вашу точку зрения, что да, вы можете пометить классы как не ленивую загрузку. Но, поскольку nHibernate не будет создавать никаких ваших прокси, вы застрял.)

Я не знаю, полезно ли это, но это ' как Касл это делает. Теперь, когда (если вы используете 2.1) , вы можете выбрать, какой генератор прокси использовать , переход к , один из других вариантов может позволить вам сгенерировать прокси таким образом что соответствует вашим потребностям.

0
ответ дан 4 December 2019 в 23:07
поделиться

Вы можете деактивировать ленивую загрузку на уровне класса и активировать ее на основе свойств по свойствам, ленивая загрузка часто используется для отношений между коллекцией и ассоциацией.

public class AccountMap : ClassMap<Account>{        
    public AccountMap()
    {
        Not.LazyLoad();
        Id( x => x.Id );
        Map( x => x.Username ).LazyLoad();
        Map( x => x.Password );        
    }
}

Или вы можете попробовать с частное поле и «полевая» стратегия для него:

public class AccountMap : ClassMap<Account>{        
    public AccountMap()
    {

        Id( x => x.Id );
        Map( x => x.Username )
        Map( x => x.Password).Access.AsCamelCaseField();         
    }
}

public class AccountMap : ClassMap<Account>{        
   private string password;
   public string Password{ get; }
}
0
ответ дан 4 December 2019 в 23:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: