2013-03-08 4 views
0

У меня есть приложение WPF с NHibernate для моей базы данных. Теперь у меня есть объект Customer, который содержит объект Address.NHibernate refresh() объекта в объекте

класс Customer

public class Customer:ObjectBase 
{ 
    #region Variables 
    private int _id; 
    private string _name; 
    private Address _address; 
    private string _vat; 
    #endregion 

    #region Properties 
    public virtual int Id 
    { 
     get { return _id; } 
     set 
     { 
      _id = value; 
      OnPropertyChanged("Id"); 
     } 
    } 

    public virtual string Name 
    { 
     get { return _name; } 
     set 
     { 
      _name = value; 
      OnPropertyChanged("Name"); 
     } 
    } 

    public virtual Address Address 
    { 
     get 
     { 
      if (_address == null) 
       _address = new Address(); 
      return _address; 
     } 
     set 
     { 
      _address = value; 
      OnPropertyChanged("Address"); 
     } 
    } 

    public virtual string Vat 
    { 
     get 
     { 
      return _vat; 
     } 
     set 
     { 
      _vat = value; 
      OnPropertyChanged("Vat"); 
     } 
    } 


    #endregion 
} 

Адрес класса

public class Address:ObjectBase 
{ 
    #region Variables 
    private int _id; 
    private string _street; 
    private string _number; 
    private string _city; 
    private string _zip; 
    private string _country; 
    private Customer _customer; 
    #endregion 

    #region Properties 
    /// <summary> 
    /// Het unieke ID van een Address zoals deze in de database staat 
    /// </summary> 
    public virtual int Id 
    { 
     get 
     { 
      return _id; 
     } 
     set 
     { 
      _id = value; 
      OnPropertyChanged("Id"); 
     } 
    } 
    /* ... all other properties ...*/ 
} 
... 

В моем приложении я могу изменить свой объект Customer. Но у меня также есть кнопка отмены. Когда я нажимаю на эту кнопку, она должна показывать исходные данные этого Клиента без изменений. Поэтому я думал о выполнении функции обновления сеанса nhibernate.

NHibernateHelper.Session.Refresh(Customer); 

Но это обновляет все свойства, за исключением значений объекта Address в объекте Customer. Есть ли способ обновить значения Address?

Я попытался

NHibernateHelper.Session.Refresh(Customer.Address); 

Но это не работает ... ли кто-нибудь имеет объяснение или обходной путь для решения этой проблемы?


Edit: Возможное решение

Когда я исполню ее в следующем порядке это дает мне целое значение по умолчанию объекта

NHibernateHelper.Session.Refresh(Customer.Address); 
NHibernateHelper.Session.Refresh(Customer); 

Но я не знаю, почему вызова функции обновления в этом порядке заставляют его работать. Это нормально для меня, но любая идея, почему это должно быть в таком порядке?

+1

Вы можете поставить файл сопоставления для ваших отношений ? –

ответ

2

Иногда с NHibernate, я должен был сбросить сеанс и очистить второй кэш, чтобы решить эту проблему, и после того, как я сделать выбор, чтобы получить мои данные:

public static void ClearCache(this ISessionFactory sessionFactory) 
{ 
    sessionFactory.EvictQueries(); 
    foreach (var collectionMetadata in sessionFactory.GetAllCollectionMetadata()) 
      sessionFactory.EvictCollection(collectionMetadata.Key); 
    foreach (var classMetadata in sessionFactory.GetAllClassMetadata()) 
      sessionFactory.EvictEntity(classMetadata.Key); 
} 
+0

Я также попробую вашу функцию. Но я заметил (почему я не пробовал сначала, я не знаю ...), что при выполнении: NHibernateHelper.Session.Refresh (Customer.Address); сначала и после этого выполняю: NHibernateHelper.Session.Refresh (Customer); Это дает мне значения по умолчанию. Это нормально для меня, чтобы работать таким образом, но любая идея, почему это работает именно так? – koala

+0

mmm не знаю, это может быть ваше картографирование или что-то еще. Это то, что мне не нравится в NHibernate, у меня недостаточно контроля над запросом и другими вещами. Но это действительно хорошая FrameWork. – Steven

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