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的做任何圖形一致性你,它會自動更新一些這方面你?
對不起 - 你是說沒有必要,但最好的做法呢? – 2010-01-17 21:00:21
我的意思是說,對於任何關係來說,都必須保持一個方向;另一個方向不需要成功更新數據庫。因此,沒有必要這樣做,但編碼時必須記住哪個方向是「主」,因此是必要的。因此,最好的做法是做你的建議。 – 2010-01-17 21:15:46
我如何知道1:M關係中的哪一方是主人?如果我只需要從一個方面做到這一點,那麼爲什麼最好的做法是兩種做法? – 2010-01-20 21:01:29