Поддержание согласованности графиков в отношениях с nHibernate - PullRequest
3 голосов
/ 17 января 2010

Если я использую двунаправленные ассоциации в nHibernate, необходимо ли мне добавлять свой собственный код к обеим сторонам отношения для автоматического обновления другой стороны?

Например, если у меня есть отношение «многие к одному» между Book и Category

public class Book{
    public Category Category{ get; set; }
}

public class Category{
    public IList Books{ get; set; }
}

Нужно ли добавлять код в set () Book.Category примерно так:

private Category _category;
public Category Category {
    get { return _category;  }
    set {
        Category priorCategory = _category;
        Category newCategory = value;

        if( newCategory != priorCategory ) {
            if( priorCategory != null ) {
                _category = null;
                priorCategory.Books.Remove( this );
            }

            _category = newCategory;
            if( newCategory != null ) {
                newCategory.Books.Add( this );
            }
        }
    }
}

и также добавляет код в Category.Books что-то подобное, чтобы вызывающие абоненты могли добавлять и удалять книги из Category.Books (например, Category.Books.Add() и Category.Books.Remove())?

(обрабатывая это, оборачивая List в ObservableCollection, чтобы я мог отвечать на события добавления / удаления)

private IList _books { get; set; }
public ICollection<Book> Books
{
    get{
        if( _books == null ) _books = new ArrayList( );
        var observableBooks = new ObservableCollection<Book>( _books.Cast<Book>( ) );
        observableBooks.CollectionChanged += BookCollectionChanged;
        return observableBooks;
    }
}

private void OnBookAdded( Book addedBook ) {
    _books.Add( addedBook );
    addedBook.Category = this;
}

private void OnBookRemoved( Book removedBook ) {
    _books.Remove( removedBook );
    removedBook.Category = null;
}

// this just calls OnBookAdded() and OnBookRemoved() in response to change events
private void BookCollectionChanged( object sender, NotifyCollectionChangedEventArgs e ) {
    if( NotifyCollectionChangedAction.Add == e.Action ) {
        foreach( Book addedBook in e.NewItems ) {
            OnBookAdded( addedBook );
        }
    }

    if( NotifyCollectionChangedAction.Remove == e.Action ) {
        foreach( Book removedBook in e.OldItems ) {
            OnBookRemoved( removedBook );
        }
    }
}

Или nHibernate обеспечивает согласованность графиков для вас, чтобы он автоматически обновлял некоторые из них для вас?

1 Ответ

2 голосов
/ 17 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...