Thread View: alt.pl.comp.lang.csharp
12 messages
12 total messages
Started by Macko
Tue, 07 Dec 2010 08:28
[NH3] modyfikacja drzewa obiektów
Author: Macko
Date: Tue, 07 Dec 2010 08:28
Date: Tue, 07 Dec 2010 08:28
56 lines
3143 bytes
3143 bytes
Cze,
coraz bardziej jestem zachwycony NH3, ale mam pytanie dotyczące edycji
struktury hierarchicznej obiektów.
Przykład nieśmiertelnej bazy filmów, chcemy zmodyfikować dane
dotyczące pojedynczego filmu. Film ma oprócz tytułu polskiego, tytuł
oryginalny, datę premiery no i kolekcję gatunków. Mapowanie jest table-
per-class. Oczywiście gatunek z filmem jest powiązany fizycznie tabelą
intersekcji.
Powiedzmy że wygląda to tak:
public class Movie
{
public virtual int Id;
public virtual string TytulPolski
{ get; set; }
public virtual string TytulObcy
{ get; set; }
public virtual List<Gatunek> gatunki;
{ get; set; }
}
public class Gatunek
{
public virtual int Id
{ get; set; }
public virtual string Nazwa
{ get; set; }
}
Kejs jest dość popularny, pobieramy z bazy dane dotyczące filmu czyli
Movie wraz z kolekcją powiązanych gatunków, powiedzmy, że konwertujemy
tą klasę do odpowiadającego DTO (bez zbędnych powiązań). Poddajemy DTO
edycji - zmieniamy np tytuł polski, tytuł obcy, datę premiery, usuwamy
gatunek powiązany z filmem, a dodajemy inny. Teraz znowu konwertujemy
DTO -> model domenowy, podłączamy do sesji ten obiekt i wykonujemy
session.Save(movieDomain).
NH3 napewno sobie poradzi z zaktualizowaniem danych dotyczących samego
filmu, ale jak się ma sprawa dotycząca powiązanej kolekcji gatunków?
Czy NH będzie wiedział, które gatunki, których nie ma kolekcji trzeba
usunąć z bazy, a nowe trzeba dodać? Czy to da sie załatwić pojedynczym
session.Save(movieDomain) czy trzeba iterować po tej kolekcji i
sprawdzać w bazie? Wogóle pytanie czy jeżeli poddajecie jakiś graf
obiektów edycji to czy przechodzicie na DTO czy pracujecie na
obiektach z domeny?
--
Pozdro,
Maćko
Re: [NH3] modyfikacja drzewa obiektów
Author: Łukasz 'Maly' Ostrowski
Date: Thu, 09 Dec 2010 08:58
Date: Thu, 09 Dec 2010 08:58
28 lines
2254 bytes
2254 bytes
On Tue, 7 Dec 2010 00:28:51 -0800 (PST), Macko wrote: > Kejs jest dość popularny, pobieramy z bazy dane dotyczące filmu czyli > Movie wraz z kolekcją powiązanych gatunków, powiedzmy, że konwertujemy > tą klasę do odpowiadającego DTO (bez zbędnych powiązań). Poddajemy DTO > edycji - zmieniamy np tytuł polski, tytuł obcy, datę premiery, usuwamy > gatunek powiązany z filmem, a dodajemy inny. Teraz znowu konwertujemy > DTO -> model domenowy, podłączamy do sesji ten obiekt i wykonujemy > session.Save(movieDomain). Generanie to zależy jak robisz tą konwersję "spowrotem". > NH3 napewno sobie poradzi z zaktualizowaniem danych dotyczących samego > filmu, ale jak się ma sprawa dotycząca powiązanej kolekcji gatunków? > Czy NH będzie wiedział, które gatunki, których nie ma kolekcji trzeba > usunąć z bazy, a nowe trzeba dodać? Czy to da sie załatwić pojedynczym > session.Save(movieDomain) czy trzeba iterować po tej kolekcji i > sprawdzać w bazie? Wogóle pytanie czy jeżeli poddajecie jakiś graf > obiektów edycji to czy przechodzicie na DTO czy pracujecie na > obiektach z domeny? Ja lubie miotać po okolicy obiekty domenowe, bad practice, ale za to wygodnie ;-). -- Pozdrawiam, Łukasz 'Maly' Ostrowski. http://l3v.eu/ ICQ: 148498663 GG: 2544385 AIM: malyzgora GTalk: l3vi4than@gmail.com ASTRA: L3viathan
Re: modyfikacja drzewa obiektów
Author: Macko
Date: Thu, 09 Dec 2010 13:29
Date: Thu, 09 Dec 2010 13:29
58 lines
3275 bytes
3275 bytes
> Generanie to zale y jak robisz t konwersj "spowrotem".
DTO czyli tam i spowrotem: no ja bym to zrobił że DTO zawiera tylko
informacje aktualne
tzn. nie ma informacji o usuniętych czy dodanych np gatunkach filmów,
zawiera zwyczajnie listę gatunków przypisanych do filmu:
public class MovieDTO
{
...
public List<GatunkeDTO> gatunki
{ get; set; }
...
}
public class GatunekDTO
{
public int Id
{ get; set; }
public string Nazwa
{ get; set; }
}
No załóżmy, że jest to taka postać (resztę wyciachałem co by nie
zaśmiecać).
Więc MovieDTO nie będzie miał informacji o usuniętych / dodanych
gatunkach filmów względem oryginału.
Dobra teraz dto -> domenę:
do właściwości obiektu klasy MovieDomain przepisujemy na głupa dane
dotyczące samego filmu (id, tytuł, itp). Teraz gatunki filmów:
iterujemy po liście gatunków filmów w dto (oczywiście to wszystko w
ramach sesji) i session.Get/Load wypełniamy listę gatunków MovieDomain
przez Add do listy. Na końcu session.Save(movieDomain).
Oczywiście dla filmu jest włączone kaskadowe zapisywanie danych.
Co się stanie przy takim podejściu: czy NH wykryje co trzeba usunąć /
dodać z listy gatunków filmów?
Czy raczej trzebaby zrobić trochę inaczej: w sesji pobrać film razem z
listą gatunków filmów z zachłannym ładowaniem powiązań, potem
przepisać dla samego filmu pola (tytuły, data premiery, itd), a
następnie przelecieć listę gatunków dla filmu i porównać z listą
gatunków w dto i ewentualnie wywalić coś z domeny lub dodać.
> Ja lubie miota po okolicy obiekty domenowe, bad practice, ale
> za to wygodnie ;-).
Odpada ci mozolne struganie DTO.
--
Pozdro,
Maćko
Re: modyfikacja drzewa obiektów
Author: Łukasz 'Maly' Ostrowski
Date: Thu, 09 Dec 2010 14:06
Date: Thu, 09 Dec 2010 14:06
41 lines
2662 bytes
2662 bytes
On Thu, 9 Dec 2010 05:29:07 -0800 (PST), Macko wrote: > Więc MovieDTO nie będzie miał informacji o usuniętych / dodanych > gatunkach filmów względem oryginału. > > Dobra teraz dto -> domenę: > > do właściwości obiektu klasy MovieDomain przepisujemy na głupa dane > dotyczące samego filmu (id, tytuł, itp). Teraz gatunki filmów: > > iterujemy po liście gatunków filmów w dto (oczywiście to wszystko w > ramach sesji) i session.Get/Load wypełniamy listę gatunków MovieDomain > przez Add do listy. Na końcu session.Save(movieDomain). > Oczywiście dla filmu jest włączone kaskadowe zapisywanie danych. > > Co się stanie przy takim podejściu: czy NH wykryje co trzeba usunąć / > dodać z listy gatunków filmów? Powinien, aczkolwiek to zależy od mapowania z tego co kojarzę. Najlepiej sprawdź, ja postaram się zrobić jakiś proof-of-concept w okolicach łikendu. > Czy raczej trzebaby zrobić trochę inaczej: w sesji pobrać film razem z > listą gatunków filmów z zachłannym ładowaniem powiązań, potem > przepisać dla samego filmu pola (tytuły, data premiery, itd), a > następnie przelecieć listę gatunków dla filmu i porównać z listą > gatunków w dto i ewentualnie wywalić coś z domeny lub dodać. To z kolei musi zadziałać ;-). >> Ja lubie miota po okolicy obiekty domenowe, bad practice, ale >> za to wygodnie ;-). > > Odpada ci mozolne struganie DTO. Otóż to, to jest główny powód stojący za "brudnym wyborem", DTO/Mappery męczą nieprzeciętnie, więcej strugania mapowań niż samej funkcjonalości ;-). -- Pozdrawiam, Łukasz 'Maly' Ostrowski. http://l3v.eu/
Re: modyfikacja drzewa obiektów
Author: Macko
Date: Thu, 09 Dec 2010 14:51
Date: Thu, 09 Dec 2010 14:51
39 lines
2881 bytes
2881 bytes
> Powinien, aczkolwiek to zale y od mapowania z tego co kojarz . > Najlepiej sprawd , ja postaram si zrobi jaki proof-of-concept > w okolicach ikendu. Spox, jak będziesz miał czas to oczywiście chętnie zobaczę Twój p-o- c, ja do weekendu napewno sprawdzę drugi sposób. > > > Czy raczej trzebaby zrobi troch inaczej: w sesji pobra film razem z > > list gatunk w film w z zach annym adowaniem powi za , potem > > przepisa dla samego filmu pola (tytu y, data premiery, itd), a > > nast pnie przelecie list gatunk w dla filmu i por wna z list > > gatunk w w dto i ewentualnie wywali co z domeny lub doda . > > To z kolei musi zadzia a ;-). To wiem, że to zadziała, ale to na pewno nie jest eleganckie. Jesteś bardzie doświadczony ode mnie w tej materii, musiałeś chyba spotkać i rozgryźć tego kasztana. > Ot to, to jest g wny pow d stoj cy za "brudnym wyborem", > DTO/Mappery m cz nieprzeci tnie, wi cej strugania mapowa > ni samej funkcjonalo ci ;-). Ja tam używam do mapowań DTO->Domain->DTO AutoMappera i jestem prawdę mówiąc zachwycony. Problem jest jednak jeden, że po pierwsze trzeba te rowy wykopać (stworzyć DTO) albo ustalić hierarchię dziedziczenia, a potem dla każdej pary [DTO,Domain] poinformować mappera chociaż jedną linią kodu o chęci mapowania. Później znowu tylko jednak linijka kodu na parę i mamy elegancką konwersję obiektu na obiekt. > > -- > Pozdrawiam, > ukasz 'Maly' Ostrowski. http://l3v.eu/
Re: modyfikacja drzewa obiektów
Author: Macko
Date: Wed, 15 Dec 2010 11:49
Date: Wed, 15 Dec 2010 11:49
44 lines
3085 bytes
3085 bytes
> > Ot to, to jest g wny pow d stoj cy za "brudnym wyborem",
> > DTO/Mappery m cz nieprzeci tnie, wi cej strugania mapowa
> > ni samej funkcjonalo ci ;-).
Nie wiem czemu tak jest, ale gdy do listy gatunków powiązanych z
wybranym filmem dodam nowy gatunek wtedy zmiany są propagowane do
bazy, jeżeli natomiast usunę gatunek z listy nic się nie dzieje tzn.
nie idzie delete dla danego gatunku.
Taką metodę sobie zrobiłem aby to sprawdzić:
//
-----------------------------------------------------------------------------------------
public static void TestMovie(decimal id)
//
-----------------------------------------------------------------------------------------
{
Film film = new Film();
var baseQuery = QueryOver.Of<Film>()
.Fetch(p => p.Gatunki).Eager
.Where(p => p.Id == id);
GenericSingleton<DataProvider>.Instance.InTransaction(
session =>
{
film =
baseQuery.GetExecutableQueryOver(session).SingleOrDefault();
film.Gatunki.RemoveAt(0);
film.Gatunki.Add(new GatunkiFilmow(film,
session.Load<Gatunek>((decimal)13)));
session.SaveOrUpdate(film);
});
}
Czemu tylko dodane wartości do listy gatunków są zapisywane do bazy?
Napewno miałeś taką sytuację (kejsa), jak u siebie to obsługujesz?
--
Pozdro,
Maćko
Re: modyfikacja drzewa obiektów
Author: Łukasz 'Maly' Ostrowski
Date: Wed, 15 Dec 2010 12:38
Date: Wed, 15 Dec 2010 12:38
18 lines
1792 bytes
1792 bytes
On Wed, 15 Dec 2010 03:49:24 -0800 (PST), Macko wrote: > Czemu tylko dodane wartości do listy gatunków są zapisywane do bazy? > Napewno miałeś taką sytuację (kejsa), jak u siebie to obsługujesz? Pokazuj zawsze mapowania aktualne i entititesy ;-). Preferably na jakiegoś pastebin czy coś podobnego. Zgaduje ze znajomym że coś masz nie tak z ustawieniami kaskadowania w tymże mapowaniu. Przejrzyj: http://ayende.com/Blog/archive/2006/12/02/nhibernatecascadesthedifferentbetweenallalldeleteorphansandsaveupdate.aspx Wybacz zajebiście długiego linka ;-). -- Pozdrawiam, Łukasz 'Maly' Ostrowski. http://l3v.eu/
Re: modyfikacja drzewa obiektów
Author: Macko
Date: Wed, 15 Dec 2010 13:18
Date: Wed, 15 Dec 2010 13:18
158 lines
5327 bytes
5327 bytes
> Zgaduje ze znajomym że coś masz nie tak z ustawieniami
> kaskadowania w tymże mapowaniu.
Trochę tego jest więc zapodaje wybiórczo:
[Serializable]
public class Film
{
#region Public Properties
public virtual IList<FilmyNaPlycie> FilmyNaPlycie
{ get; set; }
public virtual IList<GatunkiFilmow> Gatunki
{ get; set; }
#endregion
}
[Serializable]
public class Gatunek
{
#region Constructors
public Gatunek() {}
public Gatunek(string nazwa)
{
this._nazwa= nazwa;
}
#endregion
#region Public Properties
public virtual decimal Id
{
get { return _id; }
set {_id= value; }
}
public virtual string Nazwa
{
get { return _nazwa; }
set {_nazwa= value; }
}
public virtual IList<GatunkiFilmow> GatunkiFilmow
{
get { return _gatunkifilmow; }
set {_gatunkifilmow= value; }
}
#endregion
}
[Serializable]
public class GatunkiFilmow
{
#region Member Variables
#endregion
#region Constructors
public GatunkiFilmow() {}
public GatunkiFilmow(Film film, Gatunek gatunek)
{
Film= film;
Gatunek= gatunek;
}
#endregion
#region Public Properties
public virtual decimal Id
{ get; set; }
public virtual Film Film
{ get; set; }
public virtual Gatunek Gatunek
{ get; set; }
#endregion
}
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<!--Build: with lujan99@usa.net Nhibernate template-->
<class name="nh.wypozyczalnia.Film,NH.Domain" table="film"
lazy="true">
<id name="Id" column="id" type="Decimal">
<generator class="native" />
</id>
<property name="TytulPolski" column="tytul_polski" type="string"
not-null="true" />
<property name="TytulObcy" column="tytul_obcy" type="string" />
<property name="DataPremiery" column="data_premiery"
type="DateTime" />
<property name="Uwagi" column="uwagi" type="string" />
<bag name="FilmyNaPlycie" inverse="true" lazy="true"
cascade="delete" >
<key column="id_filmu" />
<one-to-many class="nh.wypozyczalnia.FilmyNaPlycie,NH.Domain" />
</bag>
<bag name="Gatunki" inverse="true" lazy="true" cascade="all">
<key column="id_filmu" />
<one-to-many class="nh.wypozyczalnia.GatunkiFilmow, NH.Domain" /
>
</bag>
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<!--Build: with lujan99@usa.net Nhibernate template-->
<class name="nh.wypozyczalnia.GatunkiFilmow,NH.Domain"
table="gatunki_filmow" lazy="true">
<id name="Id" column="id" type="Decimal">
<generator class="native" />
</id>
<many-to-one name="Film" column="id_filmu" cascade="save-update"
not-null="true" />
<many-to-one name="Gatunek" column="id_gatunku" cascade="save-
update" not-null="true" />
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<!--Build: with lujan99@usa.net Nhibernate template-->
<class name="nh.wypozyczalnia.Gatunek,NH.Domain" table="gatunek"
lazy="true">
<id name="Id" column="id" type="Decimal">
<generator class="native" />
</id>
<property name="Nazwa" column="nazwa" type="string" not-
null="true" />
<bag name="GatunkiFilmow" inverse="true" lazy="true"
cascade="delete">
<key column="id_gatunku" />
<one-to-many class="nh.wypozyczalnia.GatunkiFilmow,NH.Domain" />
</bag>
</class>
</hibernate-mapping>
> --
> Pozdrawiam,
> Łukasz 'Maly' Ostrowski. http://l3v.eu/
Re: modyfikacja drzewa obiektów
Author: Łukasz 'Maly' Ostrowski
Date: Wed, 15 Dec 2010 13:44
Date: Wed, 15 Dec 2010 13:44
36 lines
2515 bytes
2515 bytes
On Wed, 15 Dec 2010 05:18:06 -0800 (PST), Macko wrote: > <?xml version="1.0" encoding="utf-8"?> > <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> > <!--Build: with lujan99@usa.net Nhibernate template--> > <class name="nh.wypozyczalnia.Film,NH.Domain" table="film" > lazy="true"> > <id name="Id" column="id" type="Decimal"> > <generator class="native" /> > </id> > <property name="TytulPolski" column="tytul_polski" type="string" > not-null="true" /> > <property name="TytulObcy" column="tytul_obcy" type="string" /> > <property name="DataPremiery" column="data_premiery" > type="DateTime" /> > <property name="Uwagi" column="uwagi" type="string" /> > > <bag name="FilmyNaPlycie" inverse="true" lazy="true" > cascade="delete" > > <key column="id_filmu" /> > <one-to-many class="nh.wypozyczalnia.FilmyNaPlycie,NH.Domain" /> > </bag> > > <bag name="Gatunki" inverse="true" lazy="true" cascade="all"> > <key column="id_filmu" /> > <one-to-many class="nh.wypozyczalnia.GatunkiFilmow, NH.Domain" / >> > </bag> > > </class> > </hibernate-mapping> Spróbuj cascade="all-delete-orphan". -- Pozdrawiam, Łukasz 'Maly' Ostrowski. http://l3v.eu/
Re: modyfikacja drzewa obiektów
Author: Macko
Date: Wed, 15 Dec 2010 13:53
Date: Wed, 15 Dec 2010 13:53
3 lines
1766 bytes
1766 bytes
> Spróbuj cascade="all-delete-orphan". W którym mapowaniu?
Re: modyfikacja drzewa obiektów
Author: Łukasz 'Maly' Ostrowski
Date: Wed, 15 Dec 2010 14:16
Date: Wed, 15 Dec 2010 14:16
12 lines
1637 bytes
1637 bytes
On Wed, 15 Dec 2010 05:53:51 -0800 (PST), Macko wrote: >> Spróbuj cascade="all-delete-orphan". > > W którym mapowaniu? W jedynym które zostawiłem w cytowaniu :). Film, relacja na Gatunki ;-). -- Pozdrawiam, Łukasz 'Maly' Ostrowski. http://l3v.eu/
Re: modyfikacja drzewa obiektów
Author: Macko
Date: Wed, 15 Dec 2010 15:50
Date: Wed, 15 Dec 2010 15:50
8 lines
2155 bytes
2155 bytes
> W jedynym które zostawiłem w cytowaniu :). Film, > relacja na Gatunki ;-). Spox, zadziałało elegancko, dzięki wielkie :) > -- > Pozdrawiam, > Łukasz 'Maly' Ostrowski. http://l3v.eu/
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads