Set, Bag, List az NHibernate -ben

Alapvető kérdés, hogy mikor milyen típust érdemes definiálni a kollekciók letöltésénél az  NHibernate -ben.

A három lehetséges versenyző: Set, Bag, List

No de miben különböznek egymástól, mikor mit érdemes használni?

Set: rendezés mentes kollekció, az indexeket nem lehet használni, minden tétele egyedi. Duplikáció nem lehetséges a tételek között! A GetHashCode és az Equals függvényeket felül kell definiálni (override) és le kell kezelni az esetleges duplikációkat! A rendezése csak az OrderBy -al, vagy egy előre definiált SortedSet segítségével lehetséges. A Set használata akkor ajánlott, hogyha a visszatérő kollekcióban biztosan egyedi tételek vannak, és kizárt a duplikálódás! Az NHibernate a kollekció visszatérésére az Iesi.Collection.ISet interface -t használja. A mapping XML -ben <set> -el kell definiálni.

Bag: rendezetlen lista, ahol megengedett a duplikálódás. A .NET IList -jét használja, azaz IList -ben adja vissza az adatokat az NHibernate -t. A Bag -et néha nevezik Multiset -nek is, a duplikálódó tételei miatt. Az index oszlopát az NHibernate nem használja és nem illeszti, így a keresés indexek alapján nem lehetséges! A mapping XML -ben <set> -el kell definiálni.

List: rendezett lista, a duplikálódás engedélyezve van. Az index oszlopot az NHibernate -ben illeszteni kell a megfelelő index mezőhöz. A kollekciót a .NET szabványos IList -en keresztül adja vissza. A mapping XML -ben <list> -el kell definiálni.

Lehetőség van még a< map>, <array> és <primitive-array> definiálására is, amire most nem térek ki… :)

18 Jun 2011, 7:38am
Ámítástechnika Mindennapok:
by
kga
Hozzászólások kikapcsolva

Lopom a netet

Mert meg nem kötöttek be a Nordtelekomosok az Adsl -t… De hála az égnek Magyarországon még jo sok nyitott hálózatot lehet találni. Angliában már büntetik az ilyen nyitott wifi hálózatokat!

9 Mar 2011, 10:27am
Ámítástechnika:
by
kga
Hozzászólások kikapcsolva

Fluent NHibernate mapping megoldások

A Fluent NHibernate -el lehetőség van automatikus és kézi mapping -re. A mapping segítségével lehet az C# osztály és az adatbázis tábla közötti kapcsolatot megteremteni. Az automatikus  feltérképezés előnye, hogy az egyszerűbb adatbázis struktúrákat gond nélkül tudja a rendszer kezelni, nem kell a programozónak felépíteni kézzel az egy – egy, egy – több, több – több kapcsolatokat. Hátránya, hogyha a táblák közötti kapcsolat bonyolult (többszörös foreign key, dictionary használata), akkor nem lesz pontos és ront!

A kézi feltérképezés esetén a programozó definiálja a táblák kapcsolatait, a C# nyelv segítségével.

A kézi térképezés beállításához a következőt kell tenni:

private AutoPersistenceModel CreateMappings()
{
AutoPersistenceModel am = new AutoPersistenceModel();
am.AddMappingsFromAssembly(System.Reflection.Assembly.GetAssembly(typeof(OnFlow.Model.Mappings.UserMapping)));
return am;
}

Ez az eljárás megkeresi azt a betöltött DLL -t, amiben a UserMapping osztály van, és ezt a DLL -t felhasználva képezi le kapcsolatokat.

Ha rá akarjuk bízni a Fluent NHibernate -re, akkor a következőket kell beírni:

private AutoPersistenceModel CreateMappings()
{
return AutoPersistenceModel.MapEntitiesFromAssemblyOf()
.Where(t => t.Namespace == “OnFlow.Model”);
}

Azaz itt azt mondtuk, hogy az OnFlow.Model alatti osztályokat próbálja meg saját maga a megadott kapcsolaton keresztül feltérképezni.