2013-09-24 2 views
1

В моем приложении перед каждым запросом я хочу сделать следующееNhibernate LazyInitializationException после Session.Clear

public List<Supplier> GetAllSuppliers() 
{ 
     NHibernateHelper.Session.Clear(); 

     string query = "from Supplier order by FirstName, LastName asc "; 

     var result = NHibernateHelper.Session.CreateQuery(query).List<Supplier>(); 

     return (List<Supplier>)result ?? new List<Supplier>(); 
} 

следующую строку кода предназначен для очистки сеанса поэтому, когда я запрашиваю все мои поставщики Я хочу иметь весь список снова из базы данных, а не из кеша. Поскольку NHibernate помнит, что объект или что-то подобное и не принимает изменения, внесенные в базу данных (мое приложение используется на нескольких компьютерах, что это главная причина, почему я хочу, чтобы получить «живые» данные)

NHibernateHelper.Session.Clear(); 

Но мой объект-поставщик имеет объект Address, который лениво загружается. В моем списке я выбираю этот объект Поставщика, и он показывает его имя, а также адрес. И вот, когда ошибки происходит:

An unhandled exception of type 'System.Windows.Markup.XamlParseException' occurred in PresentationFramework.dll 

Additional information: Initializing[Model.Supplier#1]-Could not initialize proxy - no Session. 

И если установлено, что строка кода в комментариях это работает ... Но я не хочу, чтобы поведение, которое он использует кэш ...

Mapping для Поставщик

public SupplierMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.Name); 
     Map(x => x.Btw); 
     Map(x => x.Email); 
     Map(x => x.Fax); 
     Map(x => x.Telephone);   

     References(x => x.Address).Cascade.All(); 

     HasMany(x => x.Articles); 

     Table("tbl_suppliers"); 
    } 

Mapping для адреса

public AddressMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.Street).Length(10000); 
     Map(x => x.Number).Length(10000); 
     Map(x => x.Zip).Length(10000); 
     Map(x => x.City).Length(10000); 
     Map(x => x.Country).Length(10000); 

     Table("tbl_addresses"); 
    } 

Любые идеи по этому вопросу?

EDIT Я нашел следующую ссылку: https://nhibernate.jira.com/browse/NH-2791 Похоже, с той же проблемой, но без решения ...

ответ

1

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

Session(ISession) Абстракция есть для цели, она приносит много преимуществ. Если нам не нравится получать прибыль от Сессии, мы можем использовать подход StatelessSession, но в основном нам нужна концепция Session.

Действительно, реальная проблема, которую я вижу, скрыта в теге «WPF». Вы пытаетесь использовать NHibernate вместе с WPF и Session, кажется, работает долго ... тогда он может вернуть устаревшие данные ...

Решение должно быть в правильном WPF/NHibernate Session пожизненной установки и вероятно, лучший источник для вас здесь:

Building a Desktop To-Do Application with NHibernate

+0

Я буду смотреть на ссылку предоставленной вами! – koala

+0

Я думаю, что это должно помочь. Концепция сеанса с WPF не такая тривиальная, как в веб-приложениях, где мы можем подключиться к запросу. Но эта история действительно указывает на правильное направление –

Смежные вопросы