Thread View: alt.pl.comp.lang.csharp
6 messages
6 total messages
Started by GrzybSon
Wed, 03 Nov 2010 09:00
[NH] many-to-many i session.Save(movie)
Author: GrzybSon
Date: Wed, 03 Nov 2010 09:00
Date: Wed, 03 Nov 2010 09:00
95 lines
4110 bytes
4110 bytes
Witam,
a więc ciąg dalszy walki z NH nastapił i tak:
mam sobie klasę Film i Gatunek - u mnie jest to klasyczna relacja wiele do
wielu:
<Film hbm>
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<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" />
<property name="Okladka" column="okladka" type="string" />
<many-to-one name="FormatFilmu" column="id_formatuFilmu"
cascade="save-update" />
<many-to-one name="RodzajTlumaczenia" column="id_rodzajuTlumaczenia"
cascade="save-update" />
<property name="Sciezka" column="sciezka" type="string" />
<bag name="FilmAktor" inverse="true" lazy="true" cascade="all">
<key column="id_filmu" />
<one-to-many class="nh.wypozyczalnia.FilmAktor,NH.Domain" />
</bag>
<bag name="Gatunki" table="gatunki_filmow" inverse="true"
cascade="save-update" generic="true">
<key column="id_filmu" />
<many-to-many class="nh.wypozyczalnia.Gatunek,NH.Domain"
column="id_gatunku" />
</bag>
</class>
</hibernate-mapping>
<Gatunek.hbm>
<?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="Filmy" table="gatunki_filmow" cascade="save-update"
generic="true">
<key column="id_gatunku" />
<many-to-many class="nh.wypozyczalnia.Film,NH.Domain"
column="id_filmu" />
</bag>
</class>
</hibernate-mapping>
Teraz wypełniam sobie obiekt Film danymi (także listę gatunków związanych z
filmem), ale tylko dane dotyczące samego filmu się zapisują do bazy,
a nie idą inserty związane z Gatunkami filmu.
Jak to obejść?
<kodzik zapisujący drzewko filmu>
GenericSingleton<DataProvider>.Instance.InTransaction(
session =>
{
movie.FormatFilmu = session.Load<FormatFilmu>(ff);
movie.RodzajTlumaczenia =
session.Load<RodzajTlumaczenia>(tlumaczenie);
if (gatunki != null)
{
foreach (decimal idGatunku in gatunki)
{
movie.Gatunki.Add(session.Load<Gatunek>(idGatunku));
}
}
session.Save(movie);
});
</kodzik zapisujący drzewko filmu>
--
Pozdro,
Maćko
Re: [NH] many-to-many i session.Save(movie)
Author: Łukasz 'Maly' Ostrowski
Date: Wed, 03 Nov 2010 14:57
Date: Wed, 03 Nov 2010 14:57
53 lines
2821 bytes
2821 bytes
On Wed, 3 Nov 2010 10:00:31 +0100, GrzybSon wrote: > <Film hbm> > > <?xml version="1.0" encoding="utf-8"?> > <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> > <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" /> > <property name="Okladka" column="okladka" type="string" /> > <many-to-one name="FormatFilmu" column="id_formatuFilmu" > cascade="save-update" /> > <many-to-one name="RodzajTlumaczenia" column="id_rodzajuTlumaczenia" > cascade="save-update" /> > <property name="Sciezka" column="sciezka" type="string" /> > > <bag name="FilmAktor" inverse="true" lazy="true" cascade="all"> > <key column="id_filmu" /> > <one-to-many class="nh.wypozyczalnia.FilmAktor,NH.Domain" /> > </bag> > > <bag name="Gatunki" table="gatunki_filmow" inverse="true" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > cascade="save-update" generic="true"> > <key column="id_filmu" /> > <many-to-many class="nh.wypozyczalnia.Gatunek,NH.Domain" > column="id_gatunku" /> > </bag> > </class> > </hibernate-mapping> http://stackoverflow.com/questions/712802/nhibernate-many-to-many-relationship-not-working Na szybko, Inverse na Filmie, a później dodawanie kategorii do filmu nie zahula ;-). Pozatym Many-to-Many wymusza na Tobie dodanie relacji po obu stronach tejże, do Kategorii dodajesz film, do filmu dodajesz kategorie. Szerzej w poście na SO. p.s. decimal jako typ klucza głównego to jest wybór świadomy? ;-) -- Pozdrawiam, Łukasz 'Maly' Ostrowski. http://l3v.eu/
Re: [NH] many-to-many i session.Save(movie)
Author: GrzybSon
Date: Thu, 04 Nov 2010 08:17
Date: Thu, 04 Nov 2010 08:17
80 lines
3865 bytes
3865 bytes
> Na szybko, Inverse na Filmie, a później dodawanie kategorii do
> filmu nie zahula ;-).
Trochę poszperałem i doszedłem do mapowania, które u mnie działa:
dla filmu ->
// ------------------------------------------------------------------------------------------------------------------
<?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>
...
<bag name="Gatunki" table="gatunki_filmow" cascade="all">
<key column="id_filmu" />
<many-to-many class="nh.wypozyczalnia.Gatunek,NH.Domain"
column="id_gatunku" />
</bag>
</class>
</hibernate-mapping>
// ------------------------------------------------------------------------------------------------------------------
dla gatunku ->
// ------------------------------------------------------------------------------------------------------------------
<?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>
...
<bag name="Filmy" table="gatunki_filmow" inverse="true">
<key column="id_gatunku" />
<many-to-many class="nh.wypozyczalnia.Film,NH.Domain"
column="id_filmu" />
</bag>
</class>
</hibernate-mapping>
// ------------------------------------------------------------------------------------------------------------------
i teraz elegancko działa kodzik:
GenericSingleton<DataProvider>.Instance.InTransaction(
session =>
{
movie.FormatFilmu = session.Load<FormatFilmu>(ff);
movie.RodzajTlumaczenia =
session.Load<RodzajTlumaczenia>(tlumaczenie);
if (gatunki != null)
{
Gatunek gatunek;
foreach (decimal idGatunku in gatunki)
{
movie.Gatunki.Add(session.Load<Gatunek>(idGatunku));
}
}
session.Save(movie);
});
> p.s. decimal jako typ klucza głównego to jest wybór świadomy? ;-)
Wybór świadomy dla szablonu z MyGeneration :)
W bazie PK jest typu numeric(18,0) co jest rozpoznawane jako konwertowane do
decimala w narządzie.
A czym być to zastąpił?
--
Pozdro,
Maćko
Re: [NH] many-to-many i session.Save(movie)
Author: Łukasz 'Maly' Ostrowski
Date: Thu, 04 Nov 2010 08:47
Date: Thu, 04 Nov 2010 08:47
21 lines
1664 bytes
1664 bytes
On Thu, 4 Nov 2010 09:17:23 +0100, GrzybSon wrote: >> p.s. decimal jako typ klucza głównego to jest wybór świadomy? ;-) > > Wybór świadomy dla szablonu z MyGeneration :) Chyba umiejętność samodzielnego klepania .hbmów lub mapowań via FluentNHibernate na przyszłość się przyda, as opposed to korzystanie z generatorków ;-). IMO. > W bazie PK jest typu numeric(18,0) co jest rozpoznawane jako konwertowane do > decimala w narządzie. > A czym być to zastąpił? int/long, IMO typy proste są łatwiejsze do zindeksowania, porównania etc, etc. Pozatym sekwencje/identity operują *chyba* wewnętrznie na int/longach. .NETowy decimal nie jest przesadnie "prosty" w porównaniu do int/long. -- Pozdrawiam, Łukasz 'Maly' Ostrowski. http://l3v.eu/
Re: [NH] many-to-many i session.Save(movie)
Author: GrzybSon
Date: Thu, 04 Nov 2010 11:20
Date: Thu, 04 Nov 2010 11:20
22 lines
1969 bytes
1969 bytes
Użytkownik "Łukasz 'Maly' Ostrowski" <maly@USUNnemo.pl> napisał w wiadomości news:u9cnvg3isqnt.45tpsex5vqlf$.dlg@40tude.net... > On Thu, 4 Nov 2010 09:17:23 +0100, GrzybSon wrote: >>> p.s. decimal jako typ klucza głównego to jest wybór świadomy? ;-) >> >> Wybór świadomy dla szablonu z MyGeneration :) > > Chyba umiejętność samodzielnego klepania .hbmów lub mapowań > via FluentNHibernate na przyszłość się przyda, as opposed to > korzystanie z generatorków ;-). IMO. Pewnie, że się przydaje (jak widać po poście). Dla mnie fluent jest po prostu jeszcze zbyt abstrakcyjny, bardziej przemawia do mnie mapowanie w postaci HBMa. A Ty model domenowy projektujesz po bożemu tzn. zaczynasz od modelu klas a VS, po czym generujesz bazę ze schemy czy tak jak ja? A wogóle to wolisz EF czy NH? -- Pozdro, Maćko
Re: [NH] many-to-many i session.Save(movie)
Author: Łukasz 'Maly' Ostrowski
Date: Thu, 04 Nov 2010 12:58
Date: Thu, 04 Nov 2010 12:58
20 lines
1746 bytes
1746 bytes
On Thu, 4 Nov 2010 12:20:26 +0100, GrzybSon wrote: > Pewnie, że się przydaje (jak widać po poście). Dla mnie fluent jest po > prostu jeszcze zbyt abstrakcyjny, bardziej przemawia do mnie mapowanie w > postaci HBMa. A Ty model domenowy projektujesz po bożemu tzn. zaczynasz od > modelu klas a VS, po czym generujesz bazę ze schemy czy tak jak ja? Wyklepuje klasy jako model domenowy, dodaje mapowania, najwygodniej mi we Fluencie, a później puszczam generacje bazy z mapowań, a na koniec weryfikuje co dostałem z tych mapowań ;-). > A wogóle to wolisz EF czy NH? NH, jest bardziej feature complete i mature, na chwile obecną przyglądam się NH3.0 z QueryOver i LINQ to NH. p.s. zostało decimal? =]. -- 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