1

データベース用にNHibernateを使用したWPFアプリケーションがあります。これで、Address オブジェクトを保持する 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);

ただし、これにより、Customer オブジェクトの Address オブジェクトの値を除くすべてのプロパティが更新されます。アドレス値を更新する方法はありますか?

私はもう試した

NHibernateHelper.Session.Refresh(Customer.Address);

しかし、これは機能しません...この問題を解決するための説明や回避策はありますか?


編集:可能な解決策

次の順序で実行すると、オブジェクトのデフォルト値全体が得られます

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

しかし、リフレッシュ関数をその順序で呼び出すと機能する理由がわかりません。それは私にとっては問題ありませんが、なぜその順序でなければならないのか考えていますか?

4

1 に答える 1

3

NHibernate を使用すると、問題を解決するためにセッションをリセットして 2 番目のキャッシュをクリアする必要があり、データを取得するために選択した後:

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);
}
于 2013-03-12T15:50:44.420 に答える