POCO

Ostatnio wrzuci mnie w projekcik z którym z woli klienta dostęp do bazy realizowany jest z wykorzystaniem nHibernata
Troche więc o nHibernacie aby nie umkneło na przyszłość.
Na początek
POCO = Plain Old CLR Object
Czyli proste niezwiązane klasy zawierające zazwyczaj proste property.
NHibernate nie wymaga nawet aby klasa była serializowalna wymaga jedynie domyślnego bezparametrowego konstruktora oraz publicznych property wyrażających asocjacje między klasami POCO.
Klasy POCO są reprezentacją modelu fizycznego, trzeba przestrzegać kilka zasad, rozważmy więc poniższy przykład. To asocjacja jeden-do-wiele a przypadkiem jeszcze do siebie samego.
public class Category : ISerializable 
{
   private string name;
   private Category parentCategory;
   private ISet childCategories = new HashedSet();
   public Category() { }
   ...
}
Aby zaimplementować powiązanie potrzebujemy dwóch atrybutów parentCategory implementujące końcówkę‘jeden’ połączenia oraz childCategories – atrybut kolekcja implementujący końcówkę ‘wiele’.
public ISet ChildCategories 
{
   get { return childCategories; }
   set { childCategories = value; }
}
public Category ParentCategory 
{
   get { return parentCategory; }
   set { parentCategory = value; }
}
Dodawanie childa Categoty wyglądała by tak
Category aParent = new Category();
Category aChild = new Category();
aChild.ParentCategory = aParent;
aParent.ChildCategories.Add(aChild);
Dobrze jest systematyzować takie dodawanie połączeń w procedury z wiadomych powodów
public void AddChildCategory(Category childCategory) {
if (childCategory.ParentCategory != null)
childCategory.ParentCategory.ChildCategories
.Remove(childCategory);
childCategory.ParentCategory = this;
childCategories.Add(childCategory);
}
Zawsze w takim przypadku muszą być wykonane dwie akcje:
- property parent musi zostać ustawione dla obiektu child
- obiekt child musi zostać dodany do kolekcji childów parenta.

Wynika to z faktu że NHibernate nie zarządza sam z siebie asocjacjami więc jeśli chcemy stworzyć lub zmienić jakąś asocjacje to należy zrobić tyle ile byśmy zrobili bez NHibernata. Obiekt powinien być tak napisany aby przechodzić testy jednostkowe, więc wszystkie asocjacje muszą zostać przypisane na poziomie obiektu. Jeśli asocjacja jest dwukierunkowa oba kierunki muszą zostać uzupełnione.

Komentarze

Popularne posty