<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;C0cFR3szfyp7ImA9WhRaE0Q.&quot;"><id>tag:blogger.com,1999:blog-6604133023990666837</id><updated>2012-02-16T12:16:56.587+01:00</updated><category term="ipreinserteventlistener" /><category term="hibernate" /><category term="line numbers" /><category term="RouteValueDictionary" /><category term="JsonResult" /><category term="vyhľadávanie" /><category term="javascript" /><category term="riesenia" /><category term="problemy" /><category term="anonymous types" /><category term="secure" /><category term="cisla" /><category term="cislovanie riadkov" /><category term="riadky" /><category term="date" /><category term="listbox" /><category term="insert" /><category term="tipy" /><category term="číslovanie riadkov" /><category term="seo" /><category term="C#" /><category term="výsledky" /><category term="mappingexception" /><category term="text" /><category term="software" /><category term="mozne problemy" /><category term="combobox" /><category term="unit testing" /><category term="https" /><category term="ipreupdateeventlistener" /><category term="programovanie" /><category term="Windows Development" /><category term=".net" /><category term="datetime" /><category term="timestamp" /><category term="utilitka" /><category term="WPF" /><category term="anonymous objects" /><category term="nastavenie" /><category term="System.Web.Routing" /><category term="update" /><category term="json" /><category term="nhibernate" /><category term="utility" /><category term="google" /><title>ProgramujemDobrovoľne a s piesňou na perách</title><subtitle type="html">Technologicky-orientovaný blog zameraný najmä na programovanie v C# a pre .NET a hlavne - celý v Slovenčine!</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://pperhac.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://pperhac.blogspot.com/" /><author><name>Peter Perhac</name><uri>http://www.blogger.com/profile/07346934438445576961</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_mQn5CJ5oPsc/TPloQKc-u7I/AAAAAAAACT4/BNSxnGruilk/s1600-R/49784_1197290961_3348_n.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>6</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/ProgramujemdobrovoneASPiesouNaPerch" /><feedburner:info uri="programujemdobrovoneaspiesounaperch" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;D0MMQXw4eSp7ImA9Wx9WF04.&quot;"><id>tag:blogger.com,1999:blog-6604133023990666837.post-8742809332375723384</id><published>2011-01-22T21:41:00.001+01:00</published><updated>2011-01-22T23:31:20.231+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-22T23:31:20.231+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="výsledky" /><category scheme="http://www.blogger.com/atom/ns#" term="seo" /><category scheme="http://www.blogger.com/atom/ns#" term="nastavenie" /><category scheme="http://www.blogger.com/atom/ns#" term="problemy" /><category scheme="http://www.blogger.com/atom/ns#" term="https" /><category scheme="http://www.blogger.com/atom/ns#" term="secure" /><category scheme="http://www.blogger.com/atom/ns#" term="google" /><category scheme="http://www.blogger.com/atom/ns#" term="vyhľadávanie" /><category scheme="http://www.blogger.com/atom/ns#" term="mozne problemy" /><title>Ako som sa vysporiadal s HTTPS výsledkami Google vyhľadávania</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Vyhľadával som určitú frázu na slovenskom Googli a vo výsledkoch sa  zobrazil odkaz na článok na mojich stránkach. Keď som na neho  klikol, zobrazila sa odporná výstražná stránka Firefoxu s upozornením o  nebezpečenstve návštevy mojej stránky. Niečo o tom, že  nebol nájdený žiaden certifikát pri pripájaní sa na server cez HTTPS. O  čom to je toto? &lt;a href="http://www.perhac.com/" target="_blank" title="linka sa otvori v novom okne/zalozke"&gt;Moja osobná stránka&lt;/a&gt;  je založená na CMS systéme Joomla! a neposkytujem žiadnu užívateľskú  sekciu, ani nemám žiadnu zabezpečenú zónu, v ktorej by užívatelia  komunikovali cez protokol HTTPS.&lt;br /&gt;
Zázračne, Google v niekoľkých prípadoch uvádza vo svojich výsledkoch hľadania odkazy na &lt;i&gt;správne stránky&lt;/i&gt; pod &lt;i&gt;nesprávnym protokolom&lt;/i&gt;.&lt;br /&gt;
Upozorňujem, že tento článok sa týka len tých, čo majú stránky podávané &lt;b&gt;Apache &lt;/b&gt;Web Server-om.&lt;br /&gt;
Keďže pochybujem, že by náhodný návštevník chcel pridávať  bezpečnostnú výnimku do svojho prehliadača pre moju stránku, prv než ju  navštívi, som presvedčený o tom, že ma takéto výsledky vyhľadávania  penalizujú na návštevnosti mojej stránky. Bolo treba s tým niečo robiť.  Príčinu som síce nezistil, ale so symptómami som si poradil. A to  nasledovne:&lt;br /&gt;
Aby sa mi Google, či iné roboty, nešplhali po stránkach cez https,  pridal som na svoje stránky sekundárny súbor robots.txt, s názvom  robots_ssl.txt.&lt;br /&gt;
Obsah tohto súboru je jednoduchý:&lt;br /&gt;
&lt;pre&gt;User-agent: *
Disallow: /&lt;/pre&gt;Zakážeme všetkým robotom prístup k celej stránke. Zadaním lomítka by  mala byť nedostupná celá stránka, jej hlavný adresár, aj všetky  podadresáre.&lt;br /&gt;
Ako však povedať robotom prichádzajúcim cez HTTPS na súbor  robots.txt, aby si pozreli moju alternatívnu verziu robots_ssl.txt?  Zavŕtame sa do &lt;i&gt;.htaccess &lt;/i&gt;súboru a pozrieme, či je zapnutý RewriteEngine, ak nie, potrebujeme pridať tieto riadky:&lt;br /&gt;
&lt;pre&gt;RewriteEngine On
RewriteBase /&lt;/pre&gt;Pridáme RewriteRule pre Apache, pomocou ktorého roboty prichádzajúce  cez port využívaný pri komunikácii HTTPS protokolom budú presmerované na  správny robots.txt súbor, teda v mojom prípade robots_ssl.txt vyhradený  práve pre tieto roboty:&lt;br /&gt;
&lt;pre&gt;RewriteCond %{SERVER_PORT} ^443$
RewriteRule ^robots.txt$ robots_ssl.txt&lt;/pre&gt;Toto pravidlo ich nasmeruje na správne miesto, odkiaľ by už nemali  pokračovať v prehľadávaní mojich stránok, pretože som nastavil Disallow:  / Takto nastavené robots.txt súbory by v budúcnosti mali zabrániť tomu,  aby sa vo výsledkoch hľadania zobrazovali linky na stránky s HTTPS  protokolom. No čo s tými, čo Google už má vo svojom indexe a stále  zobrazuje ľuďom pri hľadaní?&lt;br /&gt;
V mojom prípade to bolo celkom jednoduché, keďže na stránkach naozaj  nemám žiadnu zabezpečenú sekciu, do ktorej by hostia pristupovali cez  HTTPS. Stačí len pridať ešte jeden RewriteRule do .htaccess súboru: &lt;br /&gt;
&lt;pre&gt;RewriteCond %{SERVER_PORT} ^443$
RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]&lt;/pre&gt;Toto pravidlo v podstate presmeruje každý prístup na moju stránku cez  port 443 na tú istú požadovanú stránku, ale cez HTTP protokol (port  80). V hranatej zátvorke za pravidlom uvedieme ešte R=301 (pošlime nazad  response code 301 - "moved permanently" trvalo premiestnené) a písmeno  L, ktorým označíme toto presmerovacie pravidlo ako posledné (Last), aby  Apache nemusel testovať, či daný request spĺňa podmienky iných  pravidiel.&lt;br /&gt;
Časom by sa hádam aj Google mal polepšiť a všimnúť si, že všetko https://... je permanentne presunuté na http://&lt;br /&gt;
Každopádne, teraz keď kliknem na HTTPS odkaz z výsledkov Google  hľadania, som automaticky presmerovaný na správnu stránku cez HTTP  protokol.&lt;br /&gt;
Ak by ste mali problém s vašim .htaccess súborom (napríklad ja,  akonáhle som použil súbor .htaccess, celá moja stránka prestala  fungovať) budete musieť trochu pogoogliť, v čom to môže byť. Možno váš  web host nepovoľuje používanie týchto súborov, možno to však bude  spôsobené, ako v mojom prípade, riadkom, ktorý zvyčajne nájdete v  šablónach .htaccess súborov:&lt;br /&gt;
&lt;pre&gt;Options +FollowSymLinks&lt;/pre&gt;Tento riadok môže spôsobovať problém pri niektorých serverových  konfiguráciách. Tento riadok je nutný pre modul mod_rewrite, ale môže  byť už predošle nastavený vašim serverovým administrátorom tak, že sa  nedá nastaviť (zmeniť) vo vašom .htaccess súbore.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6604133023990666837-8742809332375723384?l=pperhac.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/yLNcuwT8mZ4cJK4SoU_Od9q0VfA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yLNcuwT8mZ4cJK4SoU_Od9q0VfA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/yLNcuwT8mZ4cJK4SoU_Od9q0VfA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yLNcuwT8mZ4cJK4SoU_Od9q0VfA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ProgramujemdobrovoneASPiesouNaPerch/~4/Z6kMHhkJGZw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pperhac.blogspot.com/feeds/8742809332375723384/comments/default" title="Zverejniť komentáre" /><link rel="replies" type="text/html" href="http://pperhac.blogspot.com/2011/01/ako-som-sa-vysporiadal-s-https.html#comment-form" title="0 komentárov" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6604133023990666837/posts/default/8742809332375723384?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6604133023990666837/posts/default/8742809332375723384?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProgramujemdobrovoneASPiesouNaPerch/~3/Z6kMHhkJGZw/ako-som-sa-vysporiadal-s-https.html" title="Ako som sa vysporiadal s HTTPS výsledkami Google vyhľadávania" /><author><name>Peter Perhac</name><uri>http://www.blogger.com/profile/07346934438445576961</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_mQn5CJ5oPsc/TPloQKc-u7I/AAAAAAAACT4/BNSxnGruilk/s1600-R/49784_1197290961_3348_n.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://pperhac.blogspot.com/2011/01/ako-som-sa-vysporiadal-s-https.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkUAR3k6eSp7ImA9Wx9XGU8.&quot;"><id>tag:blogger.com,1999:blog-6604133023990666837.post-2691592938513122742</id><published>2011-01-08T13:36:00.006+01:00</published><updated>2011-01-13T13:04:06.711+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-13T13:04:06.711+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="unit testing" /><category scheme="http://www.blogger.com/atom/ns#" term="JsonResult" /><category scheme="http://www.blogger.com/atom/ns#" term=".net" /><category scheme="http://www.blogger.com/atom/ns#" term="RouteValueDictionary" /><category scheme="http://www.blogger.com/atom/ns#" term="anonymous types" /><category scheme="http://www.blogger.com/atom/ns#" term="anonymous objects" /><category scheme="http://www.blogger.com/atom/ns#" term="json" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="System.Web.Routing" /><title>C# - Navrátené objekty anonymného typu.Čo s nimi?</title><content type="html">Jedna z novších čŕt jazyku C# (od C# 3.0) sú anonymné typy (vytváranie objektov neznámeho typu, respektíve objektov žiadneho deklarovaného typu). Sú vynikajúce pri použití s technológiou LINQ, no je problém s konzumovaním týchto objektov po navrátení z funkcie. Anonymné objekty sa dajú navrátiť jedine ako typu object, ktorý potom však nemáme ako využiť bez toho aby sme ho explicitne pretypovali (explicit cast). No do akého typu - ako - chceme pretypovať objekt, keď je anonymný a jeho typ bol vytvorený takzvane on-the-fly (za behu)?&lt;br /&gt;
&lt;br /&gt;
(Neviem sa tu veľmi spriateliť s formátovaním článkov na Google blogu. &lt;a href="http://www.perhac.com/index.php?option=com_content&amp;amp;task=view&amp;amp;id=198"&gt;Kuknite na to na mojej stránke&lt;/a&gt;, kde to občas aj updateujem)   &lt;br /&gt;
&lt;br /&gt;
Okrem argumentu, že by sme sa o to nemali radšej ani pokúšať, že anonymné objekty sa nemajú navrácať z metód a mali by sa použiť priamo v metóde kde boli vytvorené (všetko veľmi dobré a opodstatnené rady), sa nám poskytuje ešte niekoľko možností. Na jednu konkrétne zaujímavú som naďabil nedávno a chcel by som sa o nej zmieniť:&lt;br /&gt;
&lt;br /&gt;
Pokiaľ tvoríme aplikáciu pre ".NET Framework 4" profil a nie ".NET Framework 4 Client Profile", môžeme využiť jeden typ z namespace-u System.Web.Routing (knižnica System.Web.dll). V nastaveniach projektu zmeníme profil na .NET Framework 4 (implikácie čoho nám musia byť jasné), aby sme mohli pridať do projektu referenciu na knižnicu System.Web.dll&lt;br /&gt;
&lt;br /&gt;
V našom projekte potom stačí pridať jednu "using" klauzulu:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;using System.Web.Routing;&lt;/pre&gt;&lt;br /&gt;
A na nasledujúcej ukážke malého programíku vám ukážem čo a ako s anonymným objektom navráteným z nejakej funkcie:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;class Program
{
  static void Main(string[] args)
  {
    object anonym = Metoda_Vracia_Objekt_Anonymneho_Typu(); //CO S TYM?

    //Uz viem! Pouzijem RouteValueDictionary zo System.Web.dll
    RouteValueDictionary rvd = new RouteValueDictionary(anonym);

    //a dalej je vsetko vesele :-)
    Console.WriteLine("Ahoj, volám sa {0} a pracujem ako {1}", rvd["Meno"], rvd["Povolanie"]);
  }
 
  private static object Metoda_Vracia_Objekt_Anonymneho_Typu()
  {
    return new { Id = 1, Meno = "Peter Perhác", Povolanie = "softwareový vývojár" };
  }
}&lt;/pre&gt;&lt;br /&gt;
Tento program, ako sa dá očakávať, produkuje nasledovnú vetu (číročistá pravda):&lt;br /&gt;
Ahoj, volám sa Peter Perháč a pracujem ako softwareový vývojár&lt;br /&gt;
&lt;br /&gt;
Ta fasa, ňe?&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;Načo je nám toto dobré?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Nuž... ako som vravel, vyhúť sa navracaniu anonymných objektov z metód je dobrá rada. Vyhnite sa tomu ak môžete. Ja som narazil na potrebu kontrolovania stavu anonymných objektov pri testovaní ASP.NET MVC2 webovej aplikácie.&lt;br /&gt;
&lt;br /&gt;
Niektoré z action methods mojich kontrolerov navracali JsonResult. V JSON notácii som tam mal nejaké DATA, ktoré som do JSON formy dával cez anonymné objekty. V mojom Unit teste som chcel potom overiť, či navrátený ActionResult po zavolaní action method na kontroleri naozaj navracia JsonResult objekt a či teda Data object toho JsonResult-u má správne nastavené hodnoty svojich vlastností.&lt;br /&gt;
&lt;br /&gt;
Toto sa dá celkom jednoducho, takto v kontext ASP.NET MVC2 webovej aplikácie, pretože správny profil je už zvolený, referencia na System.Web.dll je už v projekte (teda nemusí byť za sekundu si ju môžeme pridať), stačí len naimportovať správny namespace System.Web.Routing a z neho použiť triedu RouteValueDictionary.&lt;br /&gt;
&lt;br /&gt;
Tento anonymný objekt, JSON Data, môžeme podať RouteValueDictionary v jej konštruktore a potom už len vyťahovať jednotlivé vlastnosti anonymného objektu zo slovníka použitím jeho indexer-u.&lt;br /&gt;
&lt;br /&gt;
Myslím si, že zbytočne veľa slov o niečom, čo vidíte najjednoduchšie z hore-uvedeného príkladu.&lt;br /&gt;
&lt;br /&gt;
Veselé kódovanie a veľa Wow! pocitov&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6604133023990666837-2691592938513122742?l=pperhac.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/qrEna5wfkQCIeWIodFB1y-OfNxM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qrEna5wfkQCIeWIodFB1y-OfNxM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/qrEna5wfkQCIeWIodFB1y-OfNxM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qrEna5wfkQCIeWIodFB1y-OfNxM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ProgramujemdobrovoneASPiesouNaPerch/~4/GwXq5wb7WIw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pperhac.blogspot.com/feeds/2691592938513122742/comments/default" title="Zverejniť komentáre" /><link rel="replies" type="text/html" href="http://pperhac.blogspot.com/2011/01/c-navratene-objekty-anonymneho-typu-co.html#comment-form" title="0 komentárov" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6604133023990666837/posts/default/2691592938513122742?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6604133023990666837/posts/default/2691592938513122742?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProgramujemdobrovoneASPiesouNaPerch/~3/GwXq5wb7WIw/c-navratene-objekty-anonymneho-typu-co.html" title="C# - Navrátené objekty anonymného typu.&lt;br /&gt;Čo s nimi?" /><author><name>Peter Perhac</name><uri>http://www.blogger.com/profile/07346934438445576961</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_mQn5CJ5oPsc/TPloQKc-u7I/AAAAAAAACT4/BNSxnGruilk/s1600-R/49784_1197290961_3348_n.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://pperhac.blogspot.com/2011/01/c-navratene-objekty-anonymneho-typu-co.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUBRHs6eip7ImA9Wx9SGUo.&quot;"><id>tag:blogger.com,1999:blog-6604133023990666837.post-7964972127046781794</id><published>2010-12-09T23:42:00.014+01:00</published><updated>2010-12-10T10:10:55.512+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-10T10:10:55.512+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="riesenia" /><category scheme="http://www.blogger.com/atom/ns#" term="programovanie" /><category scheme="http://www.blogger.com/atom/ns#" term="software" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="update" /><category scheme="http://www.blogger.com/atom/ns#" term="date" /><category scheme="http://www.blogger.com/atom/ns#" term="hibernate" /><category scheme="http://www.blogger.com/atom/ns#" term="timestamp" /><category scheme="http://www.blogger.com/atom/ns#" term="datetime" /><category scheme="http://www.blogger.com/atom/ns#" term="ipreinserteventlistener" /><category scheme="http://www.blogger.com/atom/ns#" term="nhibernate" /><category scheme="http://www.blogger.com/atom/ns#" term="ipreupdateeventlistener" /><category scheme="http://www.blogger.com/atom/ns#" term="insert" /><title>NHibernate a automaticky udržiavané časové známky (timestamps)</title><content type="html">&lt;style type="text/css"&gt;
pre {overflow:scroll; margin-top:3px 0px; line-height:100%; font-size:medium}
p {margin-top:12px}
&lt;/style&gt;&lt;br /&gt;
Keď padne rozhodnutie používať vo vašom projekte NHibernate, môžete si v mnohých ohľadoch uľahčiť život (teda hneď potom, čo si omotáte hlavu okolo tejto zázračnej technológie). V tomto blogu vám ukážem ako dohovoriť NHibernate, aby automaticky udržiavalo timestamps na vami-zvolených poliach (teda reálne budete potrebovať mať nanájvyš jedno pole automaticky timestampované).&lt;br /&gt;
&lt;br /&gt;
Ako príklad si uvedieme nasledovné: Užívateľ vašej (webovej) aplikácie uverejní komentár. Tento komentár bude vo vašej aplikácii obsahovať samotný text komentára a časové pole DateUpdated, v ktorom budete chcieť udržiavať dátum a čas zverejnenia/poslednej úpravy komentára. Zakaždým keď užívateľ komentár zverejní, alebo upraví, a obsah komentára je vpísaný/aktualizovaný v databáze, chceme aby sa zaznamenal aj aktuány časový údaj. Toto by za vás mohlo robiť NHibernate, stačí si ho tak nastaviť. Dobre sledujte nasledujúcich pár riadkov kódu, alebo si tie riadky skrátka len skopírujte a použite.&lt;br /&gt;
&lt;br /&gt;
Najprv vás zasypem kódom a potom trošku pokecáme o tom ako to funguje. Budeme potrebovať triedu implementujúcu dve NHibernate interface-y: IPreUpdateEventListener, IPreInsertEventListener. Táto trieda bude potrebovať dva namespace-y, ktoré si môžeme pridať medzi ostatné základné namespace-y ktoré dostaneme pri vytvorení novej čistej triedy:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;using NHibernate.Event;
using NHibernate.Persister.Entity;
&lt;/pre&gt;&lt;br /&gt;
Trieda samotná bude vyzerať takto:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;1 public class TimestampOnInsertUpdate : IPreUpdateEventListener, IPreInsertEventListener
2 {
3  public bool OnPreUpdate(PreUpdateEvent @event)
4  {
5   return !AutoUpdateTimestamps(@event.Entity, @event.Persister, @event.State, true);
6  }
7 
8  public bool OnPreInsert(PreInsertEvent @event)
9  {
10   return !AutoUpdateTimestamps(@event.Entity, @event.Persister, @event.State, false);
11  }
12 
13  private bool AutoUpdateTimestamps(object entity, IEntityPersister persister, object[] state, bool isUpdate)
14  {
15   var dateTimeProperties = entity.GetType().GetProperties().Where(p =&amp;gt; p.PropertyType.Equals(typeof(DateTime)));
16   var autoTimestampedProperties = dateTimeProperties.Where(p =&amp;gt; p.GetCustomAttributes(false).OfType&lt;autoupdatedtimestampattribute&gt;().Any());
17   if (!autoTimestampedProperties.Any())
18   {
19    return true;
20   }
21   
22   IEnumerable&lt;propertyinfo&gt; propertiesToTimestamp;
23   if (isUpdate)
24   {
25    propertiesToTimestamp = autoTimestampedProperties.Where(p =&amp;gt; !p.GetCustomAttributes(false).OfType&lt;autoupdatedtimestampattribute&gt;().First().InsertOnly);
26   }
27   else
28   {
29    propertiesToTimestamp = autoTimestampedProperties;
30   }
31 
32   if (!autoTimestampedProperties.Any())
18   {
19    return true;
20   }
34 
35   var timestamp = DateTime.Now;
36   try
37   {
38    foreach (var propertyToTimestamp in propertiesToTimestamp)
39    {
40     Set(persister, state, propertyToTimestamp.Name, timestamp);
41     propertyToTimestamp.SetValue(entity, timestamp, null);
42    }
43   }
44   catch (InvalidOperationException)
45   {
46    return false;
47   }
48   return true;
49  }
50 
51  private void Set(IEntityPersister persister, object[] state, string propertyName, object value)
52  {
53   var index = Array.IndexOf(persister.PropertyNames, propertyName);
54   state[index] = value;
55  }
56 }
&lt;/autoupdatedtimestampattribute&gt;&lt;/propertyinfo&gt;&lt;/autoupdatedtimestampattribute&gt;&lt;/pre&gt;&lt;br /&gt;
Ďalej si budeme potrebovať nadefinovať svoju vlastnú atribútu (custom attribute) AutoUpdatedTimestampAttribute, ktorej definícia bude veľmi jednoduchá:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;[AttributeUsage(AttributeTargets.Property, AllowMultiple=false)]
public sealed class AutoUpdatedTimestampAttribute : System.Attribute {

 public bool InsertOnly { get; set; }

 public AutoUpdatedTimestampAttribute()
 {
  InsertOnly = false;
 }
}
&lt;/pre&gt;&lt;br /&gt;
Naša modelová trieda bude potom môcť takto jednoducho prehlásiť, že niektoré z jej vlastností (properties) potrebujú mať vždy automaticky aktualizovanú časovú známku (timestamp). Príkladná trieda dole napríklad našepkáva NHibernate, žeby bola rada keby sa jej ktosi ujal a aktualizoval jej DateUpdated vlastnosť (pri každom uložení zmeny alebo vytvorení nového záznamu v databáze). Taktiež sa zmieňuje, že by bolo fajn keby pred vložením záznamu (ale len pre &lt;i&gt;vložením&lt;/i&gt;) do databázy bola vlastnosť DateCreated nastavená na aktuálny dátum/čas.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;...
public virtual string Comments { get; set; }
public virtual DateTime DateLastUsed { get; set; }

[AutoUpdatedTimestamp]
public virtual DateTime DateUpdated { get; set; }

[AutoUpdatedTimestamp(InsertOnly=true)]
public virtual DateTime DateCreated { get; set; }
...
&lt;/pre&gt;&lt;br /&gt;
Ešte nám treba objasniť NHibernate, že kde bolo tam bolo, žila raz jedna trieda TimestampOnInsertUpdate, ktorá sa zaujíma o dianie v NHibernate mechanizme pred insert-om/update-om. Stačí pár riadkov medzi nakonfigurovanie NHibernate a vytvorenie ISessionFactory:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;var nhConfig = new NHibernate.Cfg.Configuration().Configure();
var timestamper = new TimestampOnInsertUpdate();
nhConfig.EventListeners.PreUpdateEventListeners = new NHibernate.Event.IPreUpdateEventListener[] { timestamper };
nhConfig.EventListeners.PreInsertEventListeners = new NHibernate.Event.IPreInsertEventListener[] { timestamper };
return nhConfig.BuildSessionFactory();
&lt;/pre&gt;&lt;br /&gt;
Mohli by sme ich tu zaregistrovať viac než dosť, keďže priradzujeme pole event listernerov. Mohli by sme si zostaviť celú radu listenerov takto:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;nhConfig.EventListeners.PreUpdateEventListeners = new NHibernate.Event.IPreUpdateEventListener[] {
 timestamper, id_generator, some_other_listener, nonsense_generator, ...
};
...&lt;/pre&gt;&lt;br /&gt;
Ale to hádam všetci vieme :-)&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Ako to funguje&lt;/h1&gt;&lt;br /&gt;
Naša NHibernate IPreInsertEventListener a IPreUpdateEventListener implementujúca trieda je asi najzaujímavejšia časť z toho čo som tu uviedol. Preto som k jej kódu pripojil aj čísla riadkov, aby sa mi na ňu lepšie komentovalo. (Ak vám čísla riadkov prekážajú pri copy-paste robote, vedzte, že nie je prečo robiť paniku: Visual Studio má schopnosť &lt;b&gt;stĺpcovej editácie&lt;/b&gt; a tak si pokojne vložte kód aj s číslami do Visual Studia a potom stlačte a držte Alt a myškou označte celý stĺpec čísel a tabulátorov. Zmažeme a práca hotová.)&lt;br /&gt;
&lt;br /&gt;
Najprv však v skratke popíšem všetko ostatné a prečo sme to nakódovali tak ako sme to nakódovali a nie nejak ináč (v článku uvedenom na spodku blogu je uvedený trošku iný príklad používajúci IAuditable interface (ak sa nemýlim)). Využitím vlastnej atribúty a neskôr reflection mechanizmu získame flexibilitu - naše modelové triedy nemusia implementovať žiaden konkrétny interface, ich DateTime vlastnosti nemusia mať také-či-onaké konkrétne predpísané meno, ale je celkom na nás, ktorú vlastnosť označíme našou atribútou. Ak by sme časom odpojili náš IPreInsertEventListener / IPreUpdateEventListener od NHibernate (rozhodli sa nepoužiť NHibernate na udržiavanie časových známok (rozhodneme sa použiť default values na databázových poliach, resp. databázové trigger-y alebo inú metódu), naše modelové triedy môžu pokojne zostať nezmenené, pretože atribúty ani nemusíme odobrať - ak nie sú nikým využité, nevadí.&lt;br /&gt;
&lt;br /&gt;
Náš listener sa dá jednoducho zapojiť / odpojiť z mechanizmu NHibernate, ako sme videli vyššie. Samozrejme si podobným spôsobom môžeme naprogramovať iné &lt;i&gt;aspekty&lt;/i&gt; našej aplikácie a pripojiť ich do mechanizmu. V našej aplikécii sa začne diať mágia :-) Tieto listenery musíme zapojiť do NHibernate konfigurácie ešte pred požiadaním o konštrukciu ISessionFactory.&lt;br /&gt;
&lt;br /&gt;
Implementácia našej vlastnej attribúty je jednoduchá, stačí (ako pri každej vlastnej atribúte) vytvoriť uzavretú - sealed - triedu dediacu od System.Attribute a dodať tých pár základných riadkov. Komentár utratím už len na nôtu tohto riadku:&lt;br /&gt;
&lt;pre&gt;[AttributeUsage(AttributeTargets.Property, AllowMultiple=false)]&lt;/pre&gt;Obmedzíme použitie našej atribúty na vlastnosti (čiže aby sme nimi neokrašľovali triedy / metódy atď.) a tiež aby sa mohla uplatniť len jedna atribúta thoto typu na jednu vlatnosť (property). Bol by to chaos, keby môžeme anotovať vlastnosť dvoma protichodnými atribútami:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;[AutoUpdatedTimestamp]
[AutoUpdatedTimestamp(InsertOnly=true)]
public virtual DateTime MyProperty;&lt;/pre&gt;&lt;br /&gt;
Náš zázračný listener by nevedel čo s takou vlastnosťou.&lt;br /&gt;
&lt;br /&gt;
Náš listener TimestampOnInsertUpdate na prvých dvanástich riadkoch len implementuje metódy, ktoré musí, sú predpísané v IPreInsertEventListener / IPreUpdateEventListener interface-och. Z oboch metód zavolá magickú metódu AutoUpdateTimestamps a pošle jej to čo treba na celý trik. To sú argumenty entity, persister, state a isUpdate. Entity je náš modelový objekt ktorého stav sa snažíme vopchať do databázy. Persister je objekt zodpovedný za vykonanie samotného úkonu (emituje SQL príkaz(y)), state je aktuálny stav entity, ktorý NHibernate extrahoval z entity a pokúsi sa ho persistovať (uchovať v databáze) pomocou persisteru. Booleanská hodnota isUpdate len informuje o tom, či sa koná insert alebo update (potrebné pre vlastnosti kde atribúta má vlastnosť InsertOnly=true).&lt;br /&gt;
&lt;br /&gt;
Riadok 15 získa z entity všetky vlastnosti typu DateTime. Riadok 16 prezrie tieto vlastnosti a vyberie z nich len tie, ktoré sme označili atribútou AutoUpdatedTimestamp. Ďalej, ak v tomto bode entita nemá žiadne pre-náš-listerner zaujímavé vlastnosti unikáme z metódy s návratovou hodnotou true - všetko OK - vybavené.&lt;br /&gt;
&lt;br /&gt;
Ďalej, od riadku 22 sa venujeme tomu aby sme pri update-ovaní nemenili vlastnosti označené ako InsertOnly. Vyfiltrujeme ich preč, aby sme nemenili to čo nemáme.&lt;br /&gt;
Na riadku 32 sa znova pozrieme, či máme čo meniť, ak nie, padáme preč.&lt;br /&gt;
&lt;br /&gt;
Ďalej už je takmer všetko jasné: zaobstaráme si timestamp (r.35) a ideme na vec - každej vhodnej vlastnosti zmeníme hodnotu na aktuálnu časovú známku (1.)priamo na entite r.41, (2.) v stave entity (argument state), ktorý bude persisterom zapísaný do databázy r.40.&lt;br /&gt;
&lt;br /&gt;
Na zmenu stavu entity si zavoláme na pomoc malú metódku r.51, ktorá za pomoci informácií o persisterovi nastaví správnu časť objeku state na patričnú hodnotu.&lt;br /&gt;
Krok na riadku 41 je veľmi dôležitý: ako vysvetľuje stránka uvedená na spodku tohto článku, vynechaním tohto kroku by sme si mohli privodiť veľa veľa starostí debugovaním ťažko nájditeľných problémov. Hoci na databázovom servri by sme mali časovú známku nastavenú správne, nebola by v synchróne so stavom našej entity (náš objektový model by nebol zhodný s modelom persistovaným v našej databáze), čo by očividne mohlo napáchať škodu v rámci aplikácie. (Alebo aj nie, ak máme šťastie... radšej ani neskúšajme.)&lt;br /&gt;
&lt;br /&gt;
A to je všetko. Je to &lt;i&gt;v podstate&lt;/i&gt; celé jednoduché ako detská hračka, len človek sa samozrejme nenarodil s inštinktívnou znalosťou NHibernate a C#, tak si pomáhame blogmi ako tento. Dúfam, že som niekomu pomohol. Happy coding!&lt;br /&gt;
&lt;br /&gt;
Niektoré časti tejto implementácie boli založené na kóde nájdenom v tomto&lt;br /&gt;
článku:&amp;nbsp;&lt;a href="http://ayende.com/Blog/archive/2009/04/29/nhibernate-ipreupdateeventlistener-amp-ipreinserteventlistener.aspx" target="_blank" title="linka sa otvorí v novom okne"&gt;Ayende Rahien a jeho článok o IPreInsertEventListener a IPreUpdateEventListener&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6604133023990666837-7964972127046781794?l=pperhac.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HU-B5IX1tgy2paRGX_SzOmC3tF8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HU-B5IX1tgy2paRGX_SzOmC3tF8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/HU-B5IX1tgy2paRGX_SzOmC3tF8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HU-B5IX1tgy2paRGX_SzOmC3tF8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ProgramujemdobrovoneASPiesouNaPerch/~4/shV6eVkz9_E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pperhac.blogspot.com/feeds/7964972127046781794/comments/default" title="Zverejniť komentáre" /><link rel="replies" type="text/html" href="http://pperhac.blogspot.com/2010/12/nhibernate-automaticky-udrziavane.html#comment-form" title="0 komentárov" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6604133023990666837/posts/default/7964972127046781794?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6604133023990666837/posts/default/7964972127046781794?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProgramujemdobrovoneASPiesouNaPerch/~3/shV6eVkz9_E/nhibernate-automaticky-udrziavane.html" title="NHibernate a automaticky udržiavané časové známky (timestamps)" /><author><name>Peter Perhac</name><uri>http://www.blogger.com/profile/07346934438445576961</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_mQn5CJ5oPsc/TPloQKc-u7I/AAAAAAAACT4/BNSxnGruilk/s1600-R/49784_1197290961_3348_n.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://pperhac.blogspot.com/2010/12/nhibernate-automaticky-udrziavane.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUAMSHg8cCp7ImA9Wx9SGUw.&quot;"><id>tag:blogger.com,1999:blog-6604133023990666837.post-9117846548820199981</id><published>2010-12-09T19:03:00.000+01:00</published><updated>2010-12-09T19:03:09.678+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-09T19:03:09.678+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="cisla" /><category scheme="http://www.blogger.com/atom/ns#" term="line numbers" /><category scheme="http://www.blogger.com/atom/ns#" term="text" /><category scheme="http://www.blogger.com/atom/ns#" term="riadky" /><category scheme="http://www.blogger.com/atom/ns#" term="cislovanie riadkov" /><category scheme="http://www.blogger.com/atom/ns#" term="utilitka" /><category scheme="http://www.blogger.com/atom/ns#" term="číslovanie riadkov" /><category scheme="http://www.blogger.com/atom/ns#" term="utility" /><title>Číslovanie Riadkov Textu</title><content type="html">Práve som sklepal úplne jednoduchú utilitku na očíslovanie riadkov  textu. Som strácal nervy na internete, snažil som sa nájsť nejakú  on-line javascriptovú chujovinu čo by toto pre mna urobilo, ale napokon  som sa odhodlal si to za 10 minut sklepať sám. &lt;a href="http://www.perhac.com/shared/utilities/add_line_numbers.html" title="Utilitka na ocislovanie riadkov textu"&gt;Nájdete ju tu.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Nad kvalitou kódu som dlho hlavu nelámal, tak pardón, že to je dosť suboptimálne. Kód nasleduje:&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;lt;head&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;title&amp;gt;Add Line Numbers&amp;lt;/title&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script type="text/javascript"&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; function addLineNumbers(){&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var el = document.getElementById('input-text');&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var str = el.value;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var lines = str.split('\n');&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var output = "";&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for(var i = 0; i&amp;lt;lines.length; i++)&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; output += "" + (i+1) + "\t" + lines[i]+'\n';&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; el.value = output;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;lt;/head&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;lt;body&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;button onclick="javascript:addLineNumbers();"&amp;gt;Add Line Numbers&amp;lt;/button&amp;gt;&amp;lt;br/&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;textarea id="input-text" cols="80" rows="40"&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;br/&amp;gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;lt;/body&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6604133023990666837-9117846548820199981?l=pperhac.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/fz2JSIbelhutcWiUhWdJ-8gdFbk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fz2JSIbelhutcWiUhWdJ-8gdFbk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/fz2JSIbelhutcWiUhWdJ-8gdFbk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fz2JSIbelhutcWiUhWdJ-8gdFbk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ProgramujemdobrovoneASPiesouNaPerch/~4/lg2LfsxnVLU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pperhac.blogspot.com/feeds/9117846548820199981/comments/default" title="Zverejniť komentáre" /><link rel="replies" type="text/html" href="http://pperhac.blogspot.com/2010/12/cislovanie-riadkov-textu.html#comment-form" title="0 komentárov" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6604133023990666837/posts/default/9117846548820199981?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6604133023990666837/posts/default/9117846548820199981?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProgramujemdobrovoneASPiesouNaPerch/~3/lg2LfsxnVLU/cislovanie-riadkov-textu.html" title="Číslovanie Riadkov Textu" /><author><name>Peter Perhac</name><uri>http://www.blogger.com/profile/07346934438445576961</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_mQn5CJ5oPsc/TPloQKc-u7I/AAAAAAAACT4/BNSxnGruilk/s1600-R/49784_1197290961_3348_n.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://pperhac.blogspot.com/2010/12/cislovanie-riadkov-textu.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUYARHszcCp7ImA9Wx9SFEg.&quot;"><id>tag:blogger.com,1999:blog-6604133023990666837.post-6761838191780268751</id><published>2010-12-04T10:58:00.001+01:00</published><updated>2010-12-04T11:05:45.588+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-04T11:05:45.588+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="WPF" /><category scheme="http://www.blogger.com/atom/ns#" term="combobox" /><category scheme="http://www.blogger.com/atom/ns#" term="programovanie" /><category scheme="http://www.blogger.com/atom/ns#" term="Windows Development" /><category scheme="http://www.blogger.com/atom/ns#" term="listbox" /><category scheme="http://www.blogger.com/atom/ns#" term="software" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>Označenie položky v ListBoxe pomocou písania priamo do ListBoxu</title><content type="html">&lt;span style="font-size: xx-small;"&gt;&lt;a href="http://www.perhac.com/downloadable/code/WPFColors.zip"&gt;Stiahnite si celý kód k spomínanej aplikácii&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Mnohokrát si užívateľ musí vybrať jednu položku z množstva v ponuke ListBox alebo ComboBox a je to nesmierne uľahčenie života, keď môže označiť požadovanú vec zo zoznamu priamym zadaním jednotlivých&lt;br /&gt;
písmen. Teda napríklad pri výbere krajiny zo zoznamu všetkých krajín sveta v ComboBoxe je najjednoduchšie označiť ComboBox a začať vyťukávať Slove... a to by už malo stačiť na označenie položky „Slovensko“ v zozname.&lt;br /&gt;
&lt;br /&gt;
Nedávno som si naprogramoval malú utilitku na prehľadávanie (atď.) prednastavených farieb ktoré sú nadefinované v triede System.Windows.Media.Colors. Do ListBoxu som potom nasypal jednotlivé farby napojením ItemsSource na ObservableCollection triedy ColorVM (ktorá zastáva ViewModel jednotlivých farieb). &lt;span style="font-size: x-small;"&gt;&lt;a href="http://www.perhac.com/downloadable/code/WPFColors.zip"&gt;Stiahnite si celý kód k spomínanej aplikácii&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_mQn5CJ5oPsc/TPoR7UKhgRI/AAAAAAAACUg/q4Z2Rq65Vgo/s1600/OznacovaniePoloziek_ListBox.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/_mQn5CJ5oPsc/TPoR7UKhgRI/AAAAAAAACUg/q4Z2Rq65Vgo/s320/OznacovaniePoloziek_ListBox.jpg" width="274" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Nastavil som DataTemplate pre datový typ ColorVM aby jednotlivé objetky boli zobrazované v ListBoxe (a všade inde) ako obdĺžnik farebnej vzorky, vedľa ktorého je umiestnený text s názvom farby.&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;DataTemplate DataType="{x:Type local:ColorVM}" &amp;gt;...&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Takto nadefinovaný DataTemplate v App.xaml zaručuje že všetky objekty typu ColorVM v rámci aplikácie budú zdieľať rovnaký vzhľad. Prichystal som si aj políčko do ktorého užívateľ môže vpísať časťi názvu farbieb a ListBox sa podľa zadaného textu prefiltruje. Avšak, po označení ListBoxu som si všimol, že&lt;br /&gt;
sa nedajú označovať farby v ňom jednoduchým vyťukávaním názvu farby. Teda, ak by som dal Focus ListBoxu na obrázku, a začal vyťukávať „Toma“, položka s farbou „Tomato“ by sa neoznačila automaticky.&lt;br /&gt;
&lt;br /&gt;
Ako teda donútiť ListBox (alebo ComboBox) aby označoval položky ako sme na to zvyknutí? ListBox v mojom príklade obsahuje objekty typu ColorVM a automatické označovanie položiek vieme že funguje pri&lt;br /&gt;
zoznamoch, v ktorých sú textové položky. Jednoduché riešenie teda aby aj náš zoznam sa dal prehľadávať automaticky postupným zadávaním písmen od začiatku slova nasleduje:&lt;br /&gt;
&lt;br /&gt;
Stačí aby dátový typ jednotlivých položiek prekryl (override) metódu ToString. Keďže moja trieda ColorVM mala vlastnosť (property) Name, stačilo triedu ColorVM obohatiť o nasledovný kód:&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;public override string ToString()&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;return Name;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
A hneď sa položky v našom ListBoxe dajú označovať automaticky vpísaním niekoľkých začiatočných písmen.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.perhac.com/downloadable/code/WPFColors.zip"&gt;Stiahnite si celý kód k spomínanej aplikácii&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6604133023990666837-6761838191780268751?l=pperhac.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ATRk3sROy4BOER4Wk-LQSVykkdo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ATRk3sROy4BOER4Wk-LQSVykkdo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ATRk3sROy4BOER4Wk-LQSVykkdo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ATRk3sROy4BOER4Wk-LQSVykkdo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ProgramujemdobrovoneASPiesouNaPerch/~4/A_3wLtIJ6sQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pperhac.blogspot.com/feeds/6761838191780268751/comments/default" title="Zverejniť komentáre" /><link rel="replies" type="text/html" href="http://pperhac.blogspot.com/2010/12/oznacenie-polozky-v-listboxe-pomocou.html#comment-form" title="0 komentárov" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6604133023990666837/posts/default/6761838191780268751?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6604133023990666837/posts/default/6761838191780268751?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProgramujemdobrovoneASPiesouNaPerch/~3/A_3wLtIJ6sQ/oznacenie-polozky-v-listboxe-pomocou.html" title="Označenie položky v ListBoxe pomocou písania priamo do ListBoxu" /><author><name>Peter Perhac</name><uri>http://www.blogger.com/profile/07346934438445576961</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_mQn5CJ5oPsc/TPloQKc-u7I/AAAAAAAACT4/BNSxnGruilk/s1600-R/49784_1197290961_3348_n.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_mQn5CJ5oPsc/TPoR7UKhgRI/AAAAAAAACUg/q4Z2Rq65Vgo/s72-c/OznacovaniePoloziek_ListBox.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://pperhac.blogspot.com/2010/12/oznacenie-polozky-v-listboxe-pomocou.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEAASXoyeip7ImA9Wx9XGU8.&quot;"><id>tag:blogger.com,1999:blog-6604133023990666837.post-2801190468991970828</id><published>2010-12-03T22:54:00.004+01:00</published><updated>2011-01-13T13:45:48.492+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-13T13:45:48.492+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tipy" /><category scheme="http://www.blogger.com/atom/ns#" term="mappingexception" /><category scheme="http://www.blogger.com/atom/ns#" term="hibernate" /><category scheme="http://www.blogger.com/atom/ns#" term="riesenia" /><category scheme="http://www.blogger.com/atom/ns#" term="programovanie" /><category scheme="http://www.blogger.com/atom/ns#" term="problemy" /><category scheme="http://www.blogger.com/atom/ns#" term="nhibernate" /><category scheme="http://www.blogger.com/atom/ns#" term="mozne problemy" /><title>NHibernate - konfigurácia a chytáky</title><content type="html">Práve sa mi podarilo prísť na to, prečo mi môj malý skúšobný  programík s NHibernate nechcel ani za svet fungovať. Prv než zabudnem  ako som problém vyriešil a na čo všetko som cestou k riešeniu naďabil,  chcel by som si o tom urobiť záznam.&lt;br /&gt;
Problém spočíval v tom, že nech som sa snažil ako som sa snažil,  stále NHibernate vyhadzoval chybu "NHibernate.MappingException: No  persister for &amp;lt;class name&amp;gt;".&lt;br /&gt;
Užil som si pekné trápenie hľadaním problému. Preliezol som internet  krížom-krážom a našiel viacero možných príčin pre toto chybové hlásenie,  ale "no joy". Dosť frustrujúci bol fakt, že v práci pracujem na  projekte, kde úspešne mapujem s NHibernate a všetko klape. Prezrel som  niekoľko hodín video tutoriálov, prečítal niekoľko kratších aj dlhších  textov na NHibernate/Hibernate a už-už som si začínal myslieť, že  všetkému rozumiem, keď tu som doma narazil hlavou do steny a nemohol som  sa s NHibernate ani pohnúť. Neustále sa NHibernate sťažovalo na "No  persister for..."&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;Možné príčiny chyby NHibernate.MappingException&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;&lt;span style="font-size: large;"&gt;Message: No persister for &amp;lt;class name&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;
&lt;h3&gt;&lt;span style="font-size: large;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;&lt;h3&gt;&lt;span style="font-size: large;"&gt;Chýba mapovací súbor (mapping file)&lt;/span&gt;&lt;/h3&gt;Proste ste ho ešte nevytvorili alebo ste ho vytvorili mimo Visual  Studio a nepridali ste mapovací súbor do svojho projektu pomocou  Solution Explorer-u.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: small;"&gt;&lt;b&gt;Možné riešenia&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
Uistite sa, že teda naozaj mapovací súbor pre danú entitu máte v  projekte. Je to XML súbor s názvom v tvare  "MenoMapovanejEntity.hbm.xml". Pokiaľ sa nemýlim, v názve súboru  ne*musí* byť meno mapovanej entity, ale musí mať koncovku ".hbm.xml"  (hibernate mapping.xml). V jednom mapovacom XMLku môžete mať zmapovaných  niekoľko entít naraz, ale neodporúča sa to, aby ste sa potom vyhli  chaosu.&lt;br /&gt;
Pokiaľ tento súbor existuje niekde v zložkách projektu, skontrolujte  ešte či vo Visual Studiu váš projekt zahŕňa tento súbor. V Solution  Exploreri kliknite na ikonku Show All Files, navigujte k mapovaciemu  súboru, urobte jeden pravý klik :-) a zvoľte Include in Project.&lt;br /&gt;
&lt;h3&gt;&lt;span style="font-size: large;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;&lt;h3&gt;&lt;span style="font-size: large;"&gt;Build Action nastavená na Content&lt;/span&gt;&lt;/h3&gt;Jeden z ďalších dôvodov prečo sa vám NHibernate môže stále sťažovať,  že No persister for... môže byť práve taký, že hoci mapovací súbor máte,  aj je Included vo vašom projekte, jeho Build Action je ešte stále  nastavená na "Content".&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Riešenie&lt;/b&gt;&lt;br /&gt;
Toto musíte v okne Properties zmeniť na Embedded Resource, aby sa váš  xml súbor vkompiloval do výstupného .dll alebo .exe. Skontrolujte si,  či ste nastavili Embedded resource pre všetky vaše .hbm.xml mapping  files.&lt;br /&gt;
&lt;h3&gt;&lt;span style="font-size: large;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;&lt;h3&gt;&lt;span style="font-size: large;"&gt;NHibernate konfigurácia nevie v ktorej knižnici (assembly) má hľadať mapovacie info&lt;/span&gt;&lt;/h3&gt;Ďalšia často odporúčaná rada pri problémoch tohto typu je pridať  element mapping do session-factory konfigurácie v NHibernate  konfiguračnej sekcii vášho app.config súboru (ak teda je vaša NHibernate  konfigurácia umiestnená práve tam).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Riešenie&lt;/b&gt;&lt;br /&gt;
Vlastne, pokiaľ ste si zvolili metódu konfigurácie založenú na XML,  tak je jedno ci máte nastavenia v nejakom zvlášť súbore, či v ako sekciu  v app.config. Budete v nich potrebovať element mapping.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: xml"&gt;&amp;lt;hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"&amp;gt;
   &amp;lt;session-factory&amp;gt;
      &amp;lt;property name="... /&amp;gt;
      ...
      &amp;lt;mapping assembly="Kniznica"/&amp;gt;
   &amp;lt;/session-factory&amp;gt;
&amp;lt;/hibernate-configuration&amp;gt;&lt;/pre&gt;Tento element uvediete v poradí až posledný, každopádne po všetkých  "property" elementoch, ktoré nastavujú NHibernate session factory. Nič  viac v ňom nie je potrebné, len názov knižnice (assembly), ktorá  obsahuje mapované triedy a do ktorej sú vkompilované mapovacie súbory  .hbm.xml. NHibernate to pomôže v tom, že bude pri zavolaní metódy  Configure() vedieť ktorej knižnice sa ujať a prezrieť jej metadata.&lt;br /&gt;
&lt;h3&gt;&lt;span style="font-size: large;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;&lt;h3&gt;&lt;span style="font-size: large;"&gt;NHibernate.Cfg.Configuration objekt nie je nakonfigurovaný&lt;/span&gt;&lt;/h3&gt;Tento problém ma strašil niekoľko hodín. Kôli tomuto som sa vlastne  odhodlal napísať tento článok. Aj keď máte úplne všetko pre NHibernate  nastavené tak ako sa patrí a všetky mapovania máte namapované správne a  pozapájané do svojho projektu podľa všetkých múdrych rád, stále je šanca  že vám nič z toho nebude fungovať a že sa vám NHibernate stále bude  sťažovať, že No persister for... Ešte aj Stack Trace je zavádzajúci.  Popreklínal som si tvorcov NHibernate dosť keď som zistil v čom bol  problém.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Riešenie&lt;/b&gt;&lt;br /&gt;
Problém môže byť v tom ako si vytvárate NHibernate ISessionFactory. Tak napríklad mne sa podarilo nasledovné:&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;var nhConfig = new NHibernate.Cfg.Configuration();
ISessionFactory sessionFactory = nhConfig.BuildSessionFactory();&lt;/pre&gt;Problém spočíval v tom, že hoci som svoj nový objekt NHibernate kofigurácie vytvoril, nenakonfiguroval som ho zavolaním metódy Configure(). Možno mi jedného dňa niekto vysvetlí, prečo volanie funkcie  BuildSessionFactory v nanakofigurovanom stave nevedie k  InvalidOperationException. Hore-uvedený kód krásne funguje, teda okrem  toho, že pri prvom pokuse o získanie perzistentnej entity cez interface  ISession (volaním metódy Load, Get, etc...) sa NHibernate sťažuje na No  persister for... Kôli tomuto čudesnému správaniu som zabil niekoľko  hodín vŕtaním sa v mojom kóde a prezeraním konfigurácií a mapovacích  súborov a vlastností projektových súborov. Pri tom jediné, čo bolo treba  urobiť pre odstránenie problému, bolo zavolať Configure() na objekte  Configuration &lt;i&gt;skôr&lt;/i&gt; než ho požiadame o vytvorenie ISessionFactory.&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;var nhConfig = new NHibernate.Cfg.Configuration().Configure();&lt;/pre&gt;Paráda, tak a je po problémoch. Kto  narazí na  NHibernate.MappingException so správou "No persister for..." a má v  projekte všetko podľa vyššie uvedených rád, ozvite sa mi, rád sa pokúsim  pomôcť, resp. ak máte riešenie, tak popis problému aj s riešením môžeme  pripísať na zoznam.&lt;br /&gt;
Veselé kódovanie!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6604133023990666837-2801190468991970828?l=pperhac.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/NcfrbgfVo1qmupQeYculGkBxTfc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NcfrbgfVo1qmupQeYculGkBxTfc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/NcfrbgfVo1qmupQeYculGkBxTfc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NcfrbgfVo1qmupQeYculGkBxTfc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ProgramujemdobrovoneASPiesouNaPerch/~4/Psr34PBOPWc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pperhac.blogspot.com/feeds/2801190468991970828/comments/default" title="Zverejniť komentáre" /><link rel="replies" type="text/html" href="http://pperhac.blogspot.com/2010/12/nhibernate-konfiguracia-chytaky.html#comment-form" title="0 komentárov" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6604133023990666837/posts/default/2801190468991970828?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6604133023990666837/posts/default/2801190468991970828?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProgramujemdobrovoneASPiesouNaPerch/~3/Psr34PBOPWc/nhibernate-konfiguracia-chytaky.html" title="NHibernate - konfigurácia a chytáky" /><author><name>Peter Perhac</name><uri>http://www.blogger.com/profile/07346934438445576961</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_mQn5CJ5oPsc/TPloQKc-u7I/AAAAAAAACT4/BNSxnGruilk/s1600-R/49784_1197290961_3348_n.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://pperhac.blogspot.com/2010/12/nhibernate-konfiguracia-chytaky.html</feedburner:origLink></entry></feed>

