Если я использую двунаправленные ассоциации в 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 обеспечивает согласованность графиков для вас, чтобы он автоматически обновлял некоторые из них для вас?