2010-01-17 51 views
3

如果我在nHibernate中使用雙向關聯,是否需要將我自己的代碼添加到雙方的關係中以自動更新另一端?維護與nHibernate關係的圖一致性

舉例來說,如果我有一個多到一的關係和Category

之間Book

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

public class Category{ 
    public IList Books{ get; 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())?

(由一個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的做任何圖形一致性你,它會自動更新一些這方面你?

回答

2

不需要更新雙方,但總是需要更新關係的「主」方向(即,未映射爲「反向」的方向)。因此,最好的做法是編寫代碼以保持兩個方向的同步,並且從長遠來看,您會發現它使您的生活更輕鬆。

+0

對不起 - 你是說沒有必要,但最好的做法呢? – 2010-01-17 21:00:21

+0

我的意思是說,對於任何關係來說,都必須保持一個方向;另一個方向不需要成功更新數據庫。因此,沒有必要這樣做,但編碼時必須記住哪個方向是「主」,因此是必要的。因此,最好的做法是做你的建議。 – 2010-01-17 21:15:46

+0

我如何知道1:M關係中的哪一方是主人?如果我只需要從一個方面做到這一點,那麼爲什麼最好的做法是兩種做法? – 2010-01-20 21:01:29