Ошибка nhibernate поставщика нестандартной роли asp.net - PullRequest
3 голосов
/ 05 января 2011

HI,

Я реализую пользовательский поставщик ролей в своем приложении nhibernate. У меня есть хранилище, которое я вызываю всякий раз, когда хочу получить доступ к сеансу nhibernate.

Поэтому, когда мой поставщик ролей инициализирует себя

public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config) {

            base.Initialize(name, config);
            Repository = new Repository();
        }

Затем я переопределяю

public override string[] GetRolesForUser(string username) {
        var users = Repository.QueryAll<Users>();

// Затем я фильтрую и так далее

    }

Но когда эта функция вызывается, я всегда получаю сообщение об ошибке, что сеанс NHibernate закрывается.Я отладил исходный код nhibernate, и оказалось, что сессия здесь имеет другой guid, чем сессия в моих контроллерах (я также использую ASP.NET MVC).И эта конкретная сессия уже закрыта к тому времени, когда я здесь приеду.Я не знаю, кто закрывает это.Я знаю, что он запускается, когда приложение запускается, и только потом.

Кто-нибудь знает, что я делаю неправильно?Я хочу все еще использовать Nhibernate в этом провайдере, но больше не получаю ошибку.Спасибо

Ответы [ 2 ]

2 голосов
/ 26 февраля 2011

У меня была такая же проблема. Не забывайте, что поставщики ролей и членства создаются только один раз и существуют в течение всего срока действия приложения. Если вы используете шаблон «Сеанс для каждого веб-запроса», ISession будет закрыт после первого запроса, и тогда любая ссылка на ISession, внутреннюю для провайдера, вероятно, будет нулевой для последующих запросов.

Вы можете обойти это, вставив ссылку на ISessionFactory и вызвав GetCurrentSession, вместо непосредственного удержания ссылки на ISession.

1 голос
/ 16 апреля 2011

Вот как я все исправил.

в моем классе хранилища у меня было это:

public Repository()
{
    this.Session = SessionManager.GetCurrentSession();
}

Я полностью удалил конструктор, вместо этого вставил:

private ISession _session;
        protected ISession Session
        {
            get
            {
                if (_session == null)
                {
                    _session = SessionManager.GetCurrentSession();
                }
                return _session;
            }
        }
...