{"id":1198,"date":"2012-03-30T09:43:59","date_gmt":"2012-03-30T08:43:59","guid":{"rendered":"http:\/\/soci.hu\/blog\/?p=1198"},"modified":"2012-03-30T09:49:42","modified_gmt":"2012-03-30T08:49:42","slug":"miert-nhibernate","status":"publish","type":"post","link":"https:\/\/soci.hu\/blog\/index.php\/2012\/03\/30\/miert-nhibernate\/","title":{"rendered":"Mi\u00e9rt NHibernate?"},"content":{"rendered":"<p>Jeleztem kor\u00e1bban, hogy mi\u00f3ta megismertem az NHibernate-et, az\u00f3ta nem nagyon foglalkozok az Entity Frameworkkel. Mi\u00e9rt? P\u00e1r gondolatot le\u00edrok, azt\u00e1n majd kifejtem \u0151ket b\u0151vebben is.<\/p>\n<ul>\n<li>Sokf\u00e9le kulcsgener\u00e1l\u00e1st ismer. Az id gener\u00e1l\u00e1snak rendk\u00edv\u00fcl nagy hat\u00e1sa van a m\u00f3dos\u00edt\u00e1sok felviteli sebess\u00e9g\u00e9re. Eddig az assigneded \u00e9s a HILO-t haszn\u00e1ltam \u00e9l\u0151ben. SQL Serve Identity elfelejtve, considered harmful. Az SQL Server 2012 Sequence + HILO viszont egy j\u00f3 kombin\u00e1ci\u00f3 lesz.<\/li>\n<li>Batch-elt m\u0171veletek. Komplex objektum gr\u00e1fok m\u00f3dos\u00edt\u00e1sakor ez is igen sokat jelent, mivel 1 roundtrip alatt lehet sok insert-update-delete m\u0171veletet v\u00e9grehajtani. R\u00e1ad\u00e1sul pl. Oracle eset\u00e9n kihaszn\u00e1lj\u00e1k az Array Bindingot, ami kb. olyan, mint SQL servern\u00e9l a t\u00e1bla t\u00edpus\u00fa param\u00e9ter, \u00edgy eszement gyorsan tud DML m\u0171veleteket v\u00e9grehajtani.<\/li>\n<li>Rendk\u00edv\u00fcli kib\u0151v\u00edthet\u0151s\u00e9g. Az IInterceptor interf\u00e9szen kereszt\u00fcl m\u00e9lyen bele lehet ny\u00falni a m\u0171k\u00f6d\u00e9s\u00e9be. Ezt pl. field szint\u0171 securityhoz haszn\u00e1ltuk ki, e n\u00e9lk\u00fcl nem nagyon tudtuk volna megcsin\u00e1lni.<br \/>\nVagy pl. a tranzakci\u00f3k megkezd\u00e9se ut\u00e1n, de m\u00e9g az SQL parancsok v\u00e9grehajt\u00e1sa el\u0151tt be kellett tolni egy a kliensoldali felhaszn\u00e1l\u00f3t reprezent\u00e1l\u00f3 inform\u00e1ci\u00f3t (audit miatt). Erre is volt k\u00e9zenfekv\u0151 kib\u0151v\u00edt\u00e9si pont.<br \/>\nVagy oraclenek collection t\u00edpus\u00fa param\u00e9tert kellett \u00e1tadni, ezt is meg tudtuk sz\u00e9pen oldani saj\u00e1t adatt\u00edpus defini\u00e1l\u00e1s\u00e1val.<\/li>\n<li>Direkt DML m\u0171veltek. Update vagy Delete an\u00e9lk\u00fcl, hogy beh\u00fazn\u00e1nk az entit\u00e1sokat mem\u00f3ri\u00e1ba. Lehet \u00e9rvelni, hogy nem erre val\u00f3 egy O-R mapper, de ha m\u00e1r egyszer az ember entit\u00e1sokban \u00e9s nem t\u00e1bl\u00e1kban fogalmazza meg a dolgait, egyszer\u0171bb a DML-ekn\u00e9l is ezt haszn\u00e1lni. F\u0151leg pl. egy \u00f6r\u00f6kl\u0151d\u00e9ses esetben, amikor t\u00f6bb t\u00e1bl\u00e1ban is kell t\u00f6r\u00f6lni.<\/li>\n<li>Flexibilis materializ\u00e1l\u00f3. Joinolt direkt SQL select kimenet\u00e9t sz\u00e9pen bele lehet passz\u00edrozni egy objektumf\u00e1ba, egyszer\u0171en.<\/li>\n<li>Saj\u00e1t adatt\u00edpusok haszn\u00e1lta. Az Oraclenek nincs GUID t\u00edpusa, ez\u00e9rt RAW(16)-k\u00e9nt t\u00e1roltuk a guidokat. Entit\u00e1s oldalon viszont szeretj\u00fck a GUID-ot, ez\u00e9rt egy saj\u00e1t t\u00edpussal oldottuk meg a lek\u00e9pez\u00e9st, \u00edgy mindk\u00e9t oldal term\u00e9szetes absztrakci\u00f3kkal dolgozik.<\/li>\n<li>Enum mapping. Ha akarom intk\u00e9nt menti el, ha akarom stringk\u00e9nt. Hogy is van ez EF-n\u00e9l?<\/li>\n<li>Cascade m\u0171veletek gyerekekre val\u00f3 haszn\u00e1lata szab\u00e1lyozhat\u00f3.<\/li>\n<li>Szab\u00e1lyozhat\u00f3, hogy csak a megv\u00e1ltozott property-ket updatelje, vagy mindet?<\/li>\n<li>Van stateless sessionje (NHib Session kb. EF ObjectContext) nagyt\u00f6meg\u0171 adatkezel\u00e9shez<\/li>\n<li>Tud nat\u00edvan pl. t\u00f6mb\u00f6t adatb\u00e1zisra mappelni. Azaz sorsz\u00e1ma van az elemeknek, ha kit\u00f6rl\u00f6k egy elemet, akkor a felette lev\u0151 sorsz\u00e1m\u00faakat automatikusan updateli.<\/li>\n<li>Vannak current session kont\u00e9rerei. Ezek pl. WCF szerviz \u00e9s DI haszn\u00e1lata eset\u00e9n n\u00e9lk\u00fcl\u00f6zhetetlenek, \u00edgy pl. a session \u00e9lettartama a WCF OperationContexthez l\u00e1ncolhat\u00f3. Ezt annak idej\u00e9n let\u00f6lt\u00f6ttem EF-hez, el\u00e9g bonyolult volt, de ez megy ott is.<\/li>\n<li>Future Query-k: ezekkel t\u00f6bb lek\u00e9rdez\u00e9st egybe lehet f\u0171zni, hogy egy batchben hajtsa v\u00e9gre. EF-hez l\u00e1ttam ilyet a kieg\u00e9sz\u00edt\u0151 packben.<\/li>\n<li>Secondary Cache. Ezt m\u00e9g nem haszn\u00e1ltam, de \u00e9rz\u00e9sre hatalmas potenci\u00e1l van benne. Cache r\u00e9teg, \u00edgy a lek\u00e9rdez\u00e9sek egy r\u00e9sz\u00e9t mem\u00f3ri\u00e1b\u00f3l adja vissza.<\/li>\n<li>Sokf\u00e9le adatb\u00e1zis t\u00e1mogat\u00e1sa.<\/li>\n<li>Lazy properties. Bet\u00f6lti az entit\u00e1st, de nem t\u00f6lti be pl. a benne lev\u0151 byte t\u00f6mb\u00f6t, ami egy blobra meppel\u0151dik a t\u00e1bl\u00e1ban. Csak akkor t\u00f6lt\u0151dik be, ha t\u00e9nyleg hivatkozunk a property-re. Ehhez ugyanazt a virtu\u00e1lis proxy megold\u00e1st haszn\u00e1lja, mint az EF.<\/li>\n<\/ul>\n<p>Hirtelen ennyi jut az eszembe. Egyetlen, de ez nagy negat\u00edvum az EF-fel szemben a Linq providere. Az egyszer\u0171en szar, f\u00e9lk\u00e9sz, m\u00e9g most, 2012. m\u00e1rcius\u00e1ban is. Ami k\u00e9sz van, az is el\u00e9g ostoba, az EF-\u00e9 viszont okos, tudja, mi a j\u00f3 az adatb\u00e1zisnak, \u00edgy optimaliz\u00e1lja a gener\u00e1lt SQL k\u00f3dot.<br \/>\nPl. az al\u00e1bbi NHibernate LINQ-b\u00f3l: &#8230; where !a.IsValid ezt csin\u00e1lta Oracle alatt:<br \/>\nwhere not(a.IsValid).<br \/>\nEz persze table scant okoz or\u00e1n is. \u00cdgy kellett \u00e1t\u00edrni: where a.IsValid == false. Ebb\u0151l lett: where a.IsValid = 0. Ez m\u00e1r seek. De basszus, ezt elv\u00e1rn\u00e1m a LINQ providert\u0151l!<br \/>\nNincs a LINQ provider\u00e9ben outer join implement\u00e1lva! Vagy amikor \u00edrtam egy allek\u00e9rdez\u00e9ses, Take-es majd select-es nagyobb LINQ kifejez\u00e9st egyszer\u0171en NotImplementedExceptiont kaptam, \u00e9s l\u00e1ttam, az egyik NHib fejleszt\u0151 megindokolta, hogy ez mi\u00e9rt j\u00f3 \u00edgy.<br \/>\nSz\u00f3val ez a r\u00e9sze beteg, p\u00e1rszor LINQ helyett Criteria vagy HQL alap\u00fa lek\u00e9rdez\u00e9st kellett \u00edrnom, ez bosszant\u00f3, ront a j\u00f3 benyom\u00e1son.<\/p>\n<p>Tudom, hogy ez a bejegyz\u00e9s egyesek agy\u00e1t felh\u00fazza majd. Lesz, aki ut\u00e1na fog n\u00e9zni, hogy amiket pozit\u00edvumk\u00e9nt \u00edrtam, val\u00f3j\u00e1ban megvan vagy lesz EF-ben, vagy az EF Extensions packben. Lehet, nem tudok mindent \u00e9n se fejb\u0151l.<br \/>\nNyissunk vit\u00e1t, n\u00e9zz\u00fck meg, melyik-miben j\u00f3, ebb\u0151l mindenki tanulhat.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Jeleztem kor\u00e1bban, hogy mi\u00f3ta megismertem az NHibernate-et, az\u00f3ta nem nagyon foglalkozok az Entity Frameworkkel. Mi\u00e9rt? P\u00e1r gondolatot le\u00edrok, azt\u00e1n majd kifejtem \u0151ket&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8,75,25,6,74,79,4],"tags":[],"class_list":["post-1198","post","type-post","status-publish","format-standard","hentry","category-net","category-net-4","category-adonet","category-adatbazisok","category-entity-framework","category-nhibernate","category-szakmai-elet"],"_links":{"self":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/1198","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/comments?post=1198"}],"version-history":[{"count":4,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/1198\/revisions"}],"predecessor-version":[{"id":1213,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/1198\/revisions\/1213"}],"wp:attachment":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=1198"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/categories?post=1198"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/tags?post=1198"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}