<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Stefan Sedich's Blog</title><link>http://weblogs.asp.net/stefansedich/default.aspx</link><description>try { Stefan.Code(); } 
catch(BadCodeException) { NotLikely(); }</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>Unit Testing ASP.NET? ASP.NET unit testing has never been this easy</title><link>http://weblogs.asp.net/stefansedich/archive/2009/05/19/unit-testing-asp-net-asp-net-unit-testing-has-never-been-this-easy.aspx</link><pubDate>Tue, 19 May 2009 00:41:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7092440</guid><dc:creator>stefan.sedich</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/stefansedich/rsscomments.aspx?PostID=7092440</wfw:commentRss><comments>http://weblogs.asp.net/stefansedich/archive/2009/05/19/unit-testing-asp-net-asp-net-unit-testing-has-never-been-this-easy.aspx#comments</comments><description>&lt;br&gt;&lt;a href="http://www.typemock.com/" mce_href="http://www.typemock.com/"&gt;Unit Testing&lt;/a&gt; ASP.NET? &lt;a href="http://www.typemock.com/ASP.NET_unit_testing_page.php" mce_href="http://www.typemock.com/ASP.NET_unit_testing_page.php"&gt;ASP.NET unit testing&lt;/a&gt; has never been this easy.&lt;br&gt;&lt;br&gt;Typemock is launching a new product for ASP.NET developers – the &lt;strong&gt;ASP.NET Bundle&lt;/strong&gt; - and for the launch will be giving out &lt;span style="color: rgb(0, 102, 0);"&gt;&lt;strong&gt;FREE licenses&lt;/strong&gt;&lt;/span&gt; to bloggers and their readers.&lt;br&gt;&lt;br&gt;The ASP.NET Bundle is the ultimate ASP.NET unit testing solution, and offers both &lt;a href="http://www.typemock.com/" mce_href="http://www.typemock.com/"&gt;Typemock Isolator&lt;/a&gt;, a &lt;a href="http://www.typemock.com/" mce_href="http://www.typemock.com/"&gt;unit test&lt;/a&gt; tool and &lt;a href="http://sm-art.biz/Ivonna.aspx" mce_href="http://sm-art.biz/Ivonna.aspx"&gt;Ivonna&lt;/a&gt;, the Isolator add-on for &lt;a href="http://sm-art.biz/Ivonna.aspx" mce_href="http://sm-art.biz/Ivonna.aspx"&gt;ASP.NET unit testing&lt;/a&gt;, for a bargain price.&lt;br&gt;&lt;br&gt;Typemock Isolator is a leading &lt;a href="http://www.typemock.com/" mce_href="http://www.typemock.com/"&gt;.NET unit testing&lt;/a&gt; tool (C# and VB.NET) for many ‘hard to test’ technologies such as &lt;a href="http://typemock.com/sharepointpage.php" mce_href="http://typemock.com/sharepointpage.php"&gt;SharePoint&lt;/a&gt;, &lt;a href="http://www.typemock.com/ASP.NET_unit_testing_page.php" mce_href="http://www.typemock.com/ASP.NET_unit_testing_page.php"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://www.typemock.com/ASP.NET_unit_testing_page.php" mce_href="http://www.typemock.com/ASP.NET_unit_testing_page.php"&gt;MVC&lt;/a&gt;, &lt;a href="http://www.typemock.com/wcfpage.php" mce_href="http://www.typemock.com/wcfpage.php"&gt;WCF&lt;/a&gt;, WPF, &lt;a href="http://www.typemock.com/Silverlight_unit_testing_page.php" mce_href="http://www.typemock.com/Silverlight_unit_testing_page.php"&gt;Silverlight&lt;/a&gt; and more. Note that for &lt;a href="http://www.typemock.com/Silverlight_unit_testing_page.php" mce_href="http://www.typemock.com/Silverlight_unit_testing_page.php"&gt;unit testing Silverlight&lt;/a&gt; there is an open source Isolator add-on called &lt;a href="http://www.typemock.com/Silverlight_unit_testing_page.php" mce_href="http://www.typemock.com/Silverlight_unit_testing_page.php"&gt;SilverUnit&lt;/a&gt;.&lt;br&gt;&lt;br&gt;The first 60 bloggers who will blog this text in their blog and &lt;a href="http://blog.typemock.com/2009/05/get-free-typemock-licenses-aspnet.html" mce_href="http://blog.typemock.com/2009/05/get-free-typemock-licenses-aspnet.html"&gt;tell us about it&lt;/a&gt;, will get a Free Isolator ASP.NET Bundle license (Typemock Isolator + Ivonna). If you post this in an ASP.NET &lt;strong&gt;dedicated&lt;/strong&gt; blog, you'll get a license automatically (even if more than 60 submit) during the first week of this announcement.&lt;br&gt;&lt;br&gt;Also 8 bloggers will get an &lt;strong&gt;additional 2 licenses&lt;/strong&gt; (each) to give away to their readers / friends.&lt;br&gt;&lt;br&gt;Go ahead, click the following link for &lt;a href="http://blog.typemock.com/2009/05/get-free-typemock-licenses-aspnet.html" mce_href="http://blog.typemock.com/2009/05/get-free-typemock-licenses-aspnet.html"&gt;more information &lt;/a&gt;on how to get your free license.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;&lt;/span&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7092440" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stefansedich/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/Typemock/default.aspx">Typemock</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/Unit+Testing/default.aspx">Unit Testing</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/TDD/default.aspx">TDD</category></item><item><title>New Year Means A Change!!</title><link>http://weblogs.asp.net/stefansedich/archive/2008/12/22/times-of-change.aspx</link><pubDate>Mon, 22 Dec 2008 11:23:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6800666</guid><dc:creator>stefan.sedich</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/stefansedich/rsscomments.aspx?PostID=6800666</wfw:commentRss><comments>http://weblogs.asp.net/stefansedich/archive/2008/12/22/times-of-change.aspx#comments</comments><description>&lt;p&gt;Hello All, &lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;I am happy that next year is going to be a time of great change for me, I have decided it is time to move on from my home town of Perth, Australia. And am making the 4,000 odd KM journey to Brisbane, as depicted in my map kindly donated from google maps and constructed using my ms paint skills. The jorney begins in Perth (Red Dot) and ends in Brisbane (Green Dot).&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/stefansedich/journey%20map.jpg" mce_href="http://weblogs.asp.net/blogs/stefansedich/journey%20map.jpg"&gt;&lt;img src="http://weblogs.asp.net/blogs/stefansedich/journey%20map.jpg" mce_src="http://weblogs.asp.net/blogs/stefansedich/journey%20map.jpg" border="0"&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;I have been offered an excellent opportunity at a Brisbane company and I think the new year will bring me a lot of new challenges.&lt;br&gt;&lt;br&gt;What is better than a fresh start to a new year, stay tuned as I hope to ramp up my blogging in the new year and have some exciting projects/ideas on the way :).&amp;nbsp; &lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Cheers&lt;br&gt;Stefan&lt;br&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6800666" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stefansedich/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/Brisbane/default.aspx">Brisbane</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/Moving/default.aspx">Moving</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/Change/default.aspx">Change</category></item><item><title>Long time no post, here is something for fun, any object to a dictionary using an extension method!</title><link>http://weblogs.asp.net/stefansedich/archive/2008/12/09/long-time-no-post-here-is-something-for-fun-any-object-to-a-dictionary-using-an-extension-method.aspx</link><pubDate>Tue, 09 Dec 2008 14:35:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6775177</guid><dc:creator>stefan.sedich</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/stefansedich/rsscomments.aspx?PostID=6775177</wfw:commentRss><comments>http://weblogs.asp.net/stefansedich/archive/2008/12/09/long-time-no-post-here-is-something-for-fun-any-object-to-a-dictionary-using-an-extension-method.aspx#comments</comments><description>&lt;p&gt;Long time no post again :(, I will be getting back into it very soon if I can :).&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;I was a little bored tonight so I thought I would share my extension method for converting an object to a dictionary, mainly used to converting an anon type to a dictionary &lt;br&gt;for my url helper, i.e. new { id = 1, name = "bob" } will be converted to a key value dictionary, the extension method is as follows:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;public static class Extensions {&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Converts an object to a dictionary based on its properties.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&amp;lt;/summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&amp;lt;param name="value"&amp;gt;&amp;lt;/param&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static IDictionary&amp;lt;string, object&amp;gt; ToDictionary(this object value) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var dictionary = new Dictionary&amp;lt;string, object&amp;gt;();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (var prop in value.GetType().GetProperties()) {&lt;br&gt;&lt;br&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; // For each property on the type get the name and value.&lt;br&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 val = prop.GetValue(value, null);&lt;br&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; dictionary.Add(prop.Name, val);&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return dictionary;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;And to use. do this:&lt;/p&gt;&lt;p&gt;var item = new { id = 1, name = "22"};&lt;br&gt;var itemDict = item.ToDictionary();&lt;br&gt;&lt;br&gt;&lt;br&gt;This will return a dictionary from the type, but where this might also work is if you have a class say Person with 2 properties ID and Name, p.ToDictionary() will return a dictionary with Id and Name in it from the Person class.&lt;br&gt;&lt;br&gt;&lt;br&gt;Not terribly useful (I guess you could just use the RouteValueDictionary from the System.Web.Routing library, unless there is another way too), but it was helpful to me :)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Cheers&lt;br&gt;Stefan&lt;br&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6775177" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stefansedich/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/Extension+Methods/default.aspx">Extension Methods</category></item><item><title>Lazy Loaded One-To-One With NHibernate </title><link>http://weblogs.asp.net/stefansedich/archive/2008/11/13/lazy-loaded-one-to-one-with-nhibernate.aspx</link><pubDate>Thu, 13 Nov 2008 12:46:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6733035</guid><dc:creator>stefan.sedich</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/stefansedich/rsscomments.aspx?PostID=6733035</wfw:commentRss><comments>http://weblogs.asp.net/stefansedich/archive/2008/11/13/lazy-loaded-one-to-one-with-nhibernate.aspx#comments</comments><description>&lt;p&gt;&lt;b&gt;UPDATE 20081114&lt;br&gt;&lt;/b&gt;&lt;br&gt;The one-to-one solution I had posted turned out not to work for updates, :(, in the end I had to use a many-to-one map with a unique foreign key association to get this to work, the updated example is below. Sorry for my EPIC FAIL :)...&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;G'day,&lt;/p&gt;&lt;p&gt;I am working on something at the moment and I am storing BLOB data for documents in the database, I am storing things like name and data which is a binary field. |&lt;br&gt;Now I wan't to load the binary data as loading this all the time is very inneficient. So to get this to work I had to split this to two tables, one with my meta data and another one-to-one&lt;br&gt;table to store the BLOB. NOW the fun began I created the two tables:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;br&gt;Documents&lt;br&gt;-------------------&lt;br&gt;(PK) Id&lt;br&gt;(FK Unique) DocumentFileId&lt;br&gt;Name&lt;br&gt;&lt;br&gt;DocumentFiles&lt;br&gt;-------------------&lt;br&gt;(PK) Id&lt;br&gt;Data&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;From this I created my POCO classes for the Document and DocumentFile map.&lt;br&gt;&lt;/p&gt;&lt;p&gt;public class Document {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int Id { get; set; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Name { get; set; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public DocumentFile DocumentFile { get; set; }&amp;nbsp;&amp;nbsp; &lt;br&gt;}&lt;/p&gt;&lt;p&gt;&amp;nbsp;public class DocumentFile {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public virtual int Id { get; set; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public virtual Document Document { get; set; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public virtual byte[] Data { get; set; }&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;} &lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;Now on to the mappings, I thought this would be as easy as created a one-to-one mapping with lazy="proxy" set on the one-to-one on the Document class but this was not the case. &lt;br&gt;You NEED to set constrained="true" on the mapping, basically going from this post I found: &lt;a href="http://www.hibernate.org/162.html#A5" mce_href="http://www.hibernate.org/162.html#A5"&gt;http://www.hibernate.org/162.html#A5&lt;/a&gt;. Say we have A-&amp;gt;B where this is a 1-1 relationship,&lt;br&gt;now without a constraint from A-B this means A can exist without B, so there is a possiblity that B is null, a Proxy to B will be not null and won't work here.&lt;br&gt;&lt;br&gt;But when we know A and B will always belong together it is ok to create a Proxy for B. Now my final mapping files looks like so:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;u&gt;&lt;i&gt;&lt;b&gt;BUUUT&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;i&gt;&lt;b&gt;&amp;nbsp; &lt;/b&gt;&lt;/i&gt;as I soon found out if in the A mapping you constrain B it will mean it will try to insert B first and fail to generate a primary key with the foreign key generator, hence not working as expected, I had to change the mappings to use a many-to-one unique foreign key mapping to get this to work. I updated the mappings below, the main differences are highlighted below:&lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;br&gt;&amp;lt;hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;class name="NHibernateDocumentTest.Document, NHibernateDocumentTest" table="Documents" lazy="false"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;id name="Id" column="Id" type="integer"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;generator class="native" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/id&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="Name" column="Name" type="string" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;b&gt;&amp;nbsp; &amp;lt;many-to-one name="DocumentFile" cascade="all-delete-orphan" &lt;br&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;&amp;nbsp; lazy="proxy" column="DocumentFileId" unique="true" /&amp;gt;&lt;/b&gt;&lt;br&gt;&amp;nbsp; &amp;lt;/class&amp;gt;&lt;br&gt;&amp;lt;/hibernate-mapping&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;class name="NHibernateDocumentTest.DocumentFile, NHibernateDocumentTest" table="DocumentFiles" lazy="true"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt; &amp;lt;id name="Id" column="Id" type="integer"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;generator class="native" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/id&amp;gt;&amp;nbsp; &amp;nbsp;&lt;/b&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="Data" column="Data" type="Byte[]" /&amp;gt;&lt;br&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;one-to-one name="Document" constrained="true" property-ref="DocumentFile" /&amp;gt;&lt;/b&gt;&lt;br&gt;&amp;nbsp; &amp;lt;/class&amp;gt;&lt;br&gt;&amp;lt;/hibernate-mapping&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;br&gt;And then we are done, this works fine. So the trick is for a one-to-one to work with Lazy loading you must use a unique foreign key associated with a many-to-one mapping to your child.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Thanks&lt;br&gt;Stefan&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6733035" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stefansedich/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/NHibernate/default.aspx">NHibernate</category></item><item><title>Day Of Frustration</title><link>http://weblogs.asp.net/stefansedich/archive/2008/11/09/day-of-frustration.aspx</link><pubDate>Sun, 09 Nov 2008 03:25:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6726995</guid><dc:creator>stefan.sedich</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/stefansedich/rsscomments.aspx?PostID=6726995</wfw:commentRss><comments>http://weblogs.asp.net/stefansedich/archive/2008/11/09/day-of-frustration.aspx#comments</comments><description>&lt;p&gt;&amp;lt;Rant&amp;gt; &lt;br&gt;&lt;/p&gt;&lt;p&gt;I am in the process of playing around with the routing library for my current project, and I am playing around with using routing for web forms. I was running in IIS7 Classic mode (Don't ask why integrated works fine but I was seeing how this would work in IIS6 by testing with classic mode), I added a wild card mapping so that all requests would run through the asp.net pipeline and it just would not work. &lt;/p&gt;&lt;p&gt;I litterally banged my head against the wall for hours and no matter what I did the requests were not running through the pipeline. My dev machine is running vista 64bit and I never even though of this, when I was mapping the wildcard I was mapping to the 32bit framework. Argh, I luckily found the option in IIS to enable 32 bit applications and this fixed all my problems.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;A day of headache and a click to the solution, I love doing this sometimes :P&lt;/p&gt;&lt;p&gt;&amp;nbsp; &lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;/Rant&amp;gt; &lt;br&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6726995" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stefansedich/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/IIS/default.aspx">IIS</category></item><item><title>Avoid Memory Leaks When Using Windsor And Not Releasing Objects</title><link>http://weblogs.asp.net/stefansedich/archive/2008/11/05/avoid-memory-leaks-when-using-windsor-and-not-releasing-objects.aspx</link><pubDate>Wed, 05 Nov 2008 04:05:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6721177</guid><dc:creator>stefan.sedich</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/stefansedich/rsscomments.aspx?PostID=6721177</wfw:commentRss><comments>http://weblogs.asp.net/stefansedich/archive/2008/11/05/avoid-memory-leaks-when-using-windsor-and-not-releasing-objects.aspx#comments</comments><description>&lt;p&gt;I just had this issue in a project I am working on (ASP.NET Webforms Application), yesterday I ran a load test and watched my memory climb rapidly and max out not long after. I am using Castle Windsor for my IOC and mostly transient instances are registered so I did not expect any issues here as I asssumed there would be no references held to my transient instances but the leak shows this is happening. &lt;br&gt;&lt;br&gt;I am not releasing my services once done so this is partly my fault but I do not wan't to explicitly release them so I found another way which means setting the ReleasePolicy on the kernel to use the NoTrackingReleasePolicy. The default release policy is the AllComponentsReleasePolicy which from what I can see by debugging will keep track of your instances and you will need to release them manually when you are finished with the item. &lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;b&gt;Simple Fix Using NoTrackingReleasePolicy&lt;/b&gt;&lt;/p&gt;&lt;p&gt;To use this when creating your kernel set the array resolver like so to use the NoTrackingReleasePolicy for its release policy.&lt;br&gt;&lt;/p&gt;&lt;p&gt;// Create.&lt;br&gt;IKernel kernel = new DefaultKernel();&lt;br&gt;&lt;br&gt;// Set release policy.&lt;br&gt; kernel.ReleasePolicy = new NoTrackingReleasePolicy();&lt;/p&gt;&lt;p&gt;&lt;br&gt;Now my application does not leak and is stable. I am not 100% if this is the best way to handle this and if I should actually release but it is working a charm. Funny to think what would have happened if I never checked memory use like I know happens out there :\ would have been interested, and all it took was something simple to fix.&lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Cheers&lt;br&gt;Stefan&lt;br&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6721177" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stefansedich/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/Castle/default.aspx">Castle</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/Windsor/default.aspx">Windsor</category></item><item><title>Bug with Latest Google Chrome and ASP.NET Validation</title><link>http://weblogs.asp.net/stefansedich/archive/2008/11/04/bug-with-latest-google-chrome-and-asp-net-validation.aspx</link><pubDate>Tue, 04 Nov 2008 13:48:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6719804</guid><dc:creator>stefan.sedich</dc:creator><slash:comments>27</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/stefansedich/rsscomments.aspx?PostID=6719804</wfw:commentRss><comments>http://weblogs.asp.net/stefansedich/archive/2008/11/04/bug-with-latest-google-chrome-and-asp-net-validation.aspx#comments</comments><description>&lt;p&gt;Hello,&lt;/p&gt;&lt;p&gt;This is something that drove me insane today, I have a
dropdown control with a required field validator on this control. the
dropdown is also set to autopostback. Now up until after lunch today
this was working fine in chrome but after lunch it stopped. Turns out
my Chrome updated to the latest version which seemed to break
validation in the case which is shown below try the below on a page in
the latest Chrome you will see that a postback will not happen, remove
the validator and postback will work just fine.&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;pre&gt;Selected: &amp;lt;%= DropDown.SelectedValue %&amp;gt;&lt;br&gt;&amp;lt;asp:DropDownList ID="DropDown" runat="server" AutoPostBack="true"&amp;gt;&lt;br&gt;    &amp;lt;asp:ListItem Value="" Text=""&amp;gt;&amp;lt;/asp:ListItem&amp;gt;&lt;br&gt;    &amp;lt;asp:ListItem Value="0" Text="0"&amp;gt;&amp;lt;/asp:ListItem&amp;gt;&lt;br&gt;    &amp;lt;asp:ListItem Value="1" Text="1"&amp;gt;&amp;lt;/asp:ListItem&amp;gt;&lt;br&gt;    &amp;lt;asp:ListItem Value="2" Text="2"&amp;gt;&amp;lt;/asp:ListItem&amp;gt;&lt;br&gt;&amp;lt;/asp:DropDownList&amp;gt;    &lt;br&gt;&amp;lt;asp:RequiredFieldValidator ID="RequiredTest" runat="server" ControlToValidate="DropDown" ErrorMessage="Must Select Item"&amp;gt;&lt;br&gt;&amp;lt;/asp:RequiredFieldValidator&amp;gt;    &amp;nbsp;&lt;br&gt;&lt;br&gt;&lt;/pre&gt;&lt;pre&gt;I thought this must be an issue in the validation library for ASP.NET and after time narrowed it down to the ValidatorHookupEvent method in the library:&lt;/pre&gt;&lt;pre&gt;&lt;br&gt;function ValidatorHookupEvent(control, eventType, functionPrefix) {&lt;br&gt;            var ev;&lt;br&gt;&lt;br&gt;            eval("ev = control." + eventType + ";");&lt;br&gt;           &lt;br&gt;            if (typeof (ev) == "function") {&lt;br&gt;                ev = ev.toString();&lt;br&gt;                ev = ev.substring(ev.indexOf("{") + 1, ev.lastIndexOf("}"));&lt;br&gt;            }&lt;br&gt;            else {&lt;br&gt;                ev = "";&lt;br&gt;            }&lt;br&gt;&lt;br&gt;            var func;&lt;br&gt;            if (navigator.appName.toLowerCase().indexOf('explorer') &amp;gt; -1) {&lt;br&gt;                func = new Function(functionPrefix + " " + ev);&lt;br&gt;            } else {&lt;br&gt;                &lt;b&gt;func = new Function("event", functionPrefix + " " + ev);&lt;/b&gt;&lt;br&gt;            }&lt;br&gt;            &lt;br&gt;            eval("control." + eventType + " = func;");&lt;br&gt;        }&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;br&gt;Now the line in bold is in question: &lt;b&gt;func = new Function("event", functionPrefix + " " + ev);&lt;/b&gt;, this is wrapping the ev argument which is the original&lt;br&gt;onchange event on the dropdown in our case the postback and the ValidatorOnChange method, if you look at how chrome wraps the function in the&lt;br&gt;onchange when you view the value of func after it has wrapped the two together:&lt;br&gt;&lt;/pre&gt;&lt;pre&gt;function anonymous(event) { ValidatorOnChange(event); with (this.ownerDocument ? this.ownerDocument : {}) { with (this.form ? this.form : {}) { with (this) { return (function(evt){javascript:setTimeout('__doPostBack(\'DropDown\',\'\')', 0)}).call(this, evt); } } } } &lt;br&gt;&lt;br&gt;&lt;/pre&gt;&lt;pre&gt;And in firefox the wrapping is not like chrome as you can see chrome has an evt argument where firefox is different:&lt;/pre&gt;&lt;pre&gt;function anonymous(event) { ValidatorOnChange(event);javascript: setTimeout("__doPostBack('DropDown','')", 0); } &lt;/pre&gt;&lt;pre&gt;&lt;br&gt;&lt;/pre&gt;&lt;pre&gt;Now the thing to note in Chrome look at the onchange of the dropdown, say alert the items onchange event to view what it looks like, it has an evt argument which seems to cause the issue.&lt;br&gt;&lt;br&gt;function onchange(evt) {&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; with (this.ownerDocument ? this.ownerDocument : {}) { with (this.form ? this.form : {}) { with (this) { return (function(evt){javascript:setTimeout('__doPostBack(\'DropDown\',\'\')', 0)}).call(this, evt); } } } &lt;/pre&gt;&lt;pre&gt;} &amp;nbsp; &lt;br&gt;&lt;/pre&gt;&lt;pre&gt;&lt;br&gt;In firefox the onchange in firefox it uses an event argument and not evt like chrome.&lt;/pre&gt;&lt;pre&gt;function onchange(event) {&lt;br&gt;    javascript: setTimeout("__doPostBack('DropDown','')", 0);&lt;br&gt;}&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;br&gt;I found a simmilar problem and got an answer: &lt;a href="http://code.google.com/p/chromium/issues/detail?can=2&amp;amp;q=&amp;amp;colspec=ID%20Stars%20Pri%20Area%20Type%20Status%20Summary%20Modified%20Owner&amp;amp;sort=&amp;amp;id=650" mce_href="http://code.google.com/p/chromium/issues/detail?can=2&amp;amp;q=&amp;amp;colspec=ID%20Stars%20Pri%20Area%20Type%20Status%20Summary%20Modified%20Owner&amp;amp;sort=&amp;amp;id=650"&gt;http://code.google.com/p/chromium/issues/detail?can=2&amp;amp;q=&amp;amp;colspec=ID%20Stars%20Pri%20Area%20Type%20Status%20Summary%20Modified%20Owner&amp;amp;sort=&amp;amp;id=650&lt;/a&gt;, Look at the bottom, particularly this comment:&lt;pre&gt;The additional function wrapper was added in &lt;a href="http://weblogs.asp.net/p/chromium/source/detail?r=2111" mce_href="http://weblogs.asp.net/p/chromium/source/detail?r=2111"&gt;r2111&lt;/a&gt; &lt;br&gt;(http://src.chromium.org/viewvc/chrome?view=rev&amp;amp;revision=2111) and has been in Chrome &lt;br&gt;from version 0.2.153.0.&lt;/pre&gt;&lt;br&gt;From what I can see this is what is causing the issue, now who is at blame I cannot say but this is mighty anyoing :(, I knew this was working and for it to just&lt;br&gt;stop was painful and took some time to debug. But now that I know the issue it is time to tackle fixing it. There is a bit more that I have missed but it is late and I just got&lt;br&gt;down what I had for the moment. I will look into this more and keep you informed of what I come across.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;Stay Tuned&lt;br&gt;Stefan &lt;/pre&gt;&lt;/pre&gt;&lt;pre&gt; &lt;/pre&gt; 

&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6719804" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stefansedich/archive/tags/Javascript/default.aspx">Javascript</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/Validation/default.aspx">Validation</category></item><item><title>Extension Method Competition</title><link>http://weblogs.asp.net/stefansedich/archive/2008/10/22/extension-method-competition.aspx</link><pubDate>Wed, 22 Oct 2008 07:04:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6697512</guid><dc:creator>stefan.sedich</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/stefansedich/rsscomments.aspx?PostID=6697512</wfw:commentRss><comments>http://weblogs.asp.net/stefansedich/archive/2008/10/22/extension-method-competition.aspx#comments</comments><description>&lt;p&gt;I plan on holding an extension method competition, basically the idea is that you submit your favourite most useful/elegant/sexy extension method and these will be judged by a selection of judges (to be picked) and there will also be some form of reward for the winner.&lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;At this stage I am seeing if there will be interest in this, then I will then post up full and finalised details, so if you are interested and have any further suggestions please comment.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Thanks&lt;br&gt;Stefan&lt;br&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6697512" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stefansedich/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/Extension+Methods/default.aspx">Extension Methods</category></item><item><title>Enhanced Validation Control Which Provides Adding Multiple Validation Rules + NHibernate.Validator Support</title><link>http://weblogs.asp.net/stefansedich/archive/2008/10/14/enhanced-validation-control-which-provides-adding-multiple-validation-rules-nhibernate-validator-support.aspx</link><pubDate>Tue, 14 Oct 2008 14:35:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6680869</guid><dc:creator>stefan.sedich</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/stefansedich/rsscomments.aspx?PostID=6680869</wfw:commentRss><comments>http://weblogs.asp.net/stefansedich/archive/2008/10/14/enhanced-validation-control-which-provides-adding-multiple-validation-rules-nhibernate-validator-support.aspx#comments</comments><description>&lt;p&gt;Hello,&lt;/p&gt;&lt;p&gt;I am toying with something at the moment which I thought I would briefly share and see if there is any interest, my current sample is very raw and I will not post any code. But the idea is that you would do something like this for validation:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; First Name: &amp;lt;asp:TextBox ID="FirstNameText" runat="server"&amp;gt;&amp;lt;/asp:TextBox&amp;gt; &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;cc1:EnhancedValidatorControl ID="EnhancedValidationControl" runat="server" ControlToValidate="FirstNameText"&amp;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;&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;br&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; &amp;lt;ValidationRules&amp;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;cc1:PropertyBasedValidationRule Property="FirstName" Type="Validator.Model.Person, Validator" /&amp;gt;&lt;br&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; &amp;lt;/ValidationRules&amp;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; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/cc1:EnhancedValidatorControl&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Last Name: &amp;lt;asp:TextBox ID="LastNameTest" runat="server"&amp;gt;&amp;lt;/asp:TextBox&amp;gt; &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;cc1:EnhancedValidatorControl ID="EnhancedValidatorControl1" runat="server" ControlToValidate="LastNameTest"&amp;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;&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;br&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; &amp;lt;ValidationRules&amp;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;cc1:PropertyBasedValidationRule Property="LastName" Type="Validator.Model.Person, Validator" /&amp;gt;&lt;br&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; &amp;lt;/ValidationRules&amp;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; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/cc1:EnhancedValidatorControl&amp;gt;&lt;br&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Age: &amp;lt;asp:TextBox ID="AgeText" runat="server"&amp;gt;&amp;lt;/asp:TextBox&amp;gt; &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;cc1:EnhancedValidatorControl ID="EnhancedValidatorControl2" runat="server" ControlToValidate="AgeText"&amp;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;&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;br&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; &amp;lt;ValidationRules&amp;gt;&amp;nbsp;&amp;nbsp; &lt;br&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;cc1:RequiredValidationRule Message="Age required" /&amp;gt;&lt;br&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;cc1:RegexValidationRule ValidationRegex="[0-9]+" Message="Age must be numeric" /&amp;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;&amp;nbsp; &lt;br&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;cc1:PropertyBasedValidationRule Property="Age" Type="Validator.Model.Person, Validator" /&amp;gt;&lt;br&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; &amp;lt;/ValidationRules&amp;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; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/cc1:EnhancedValidatorControl&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:Button ID="btn" runat="server" Text="Go" /&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;And the model would look like so decorated with NHibernate.Validator attributes:&lt;/p&gt;&lt;p&gt;public class Person {&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int Id { get; set; } &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [NotEmpty(Message="First name should not be empty.")]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Length(0, 10, Message = "First name should be less than 10 chars")]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string FirstName { get; set; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [NotEmpty(Message = "Last name should not be empty")]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string LastName { get; set; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Range(1, 99, Message= "Age should be between 1 and 99")]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int Age { get; set; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt; &lt;br&gt;&lt;/p&gt;&lt;p&gt;As you can see we can easily and in a nice format use both client side validators + the server side proxies to the NHibernate.Validator attribute based validation (could be used to use the MS Validation Block proxies too). This also automatically wires in an AjaxCalloutExtender so we get the nice callout for both the client side and server side handlers. This seems to work quite well at the moment. I am going to tidy up and release this if there is enough interest expressed in something like this.&lt;/p&gt;&lt;p&gt;Any feedback/suggestions would be appreciated.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Thanks&lt;br&gt;Stefan&lt;br&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6680869" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stefansedich/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/NHibernate/default.aspx">NHibernate</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/Validation/default.aspx">Validation</category></item><item><title>Paging with NHibernate using a custom Extension method to make it 'easier' :)...</title><link>http://weblogs.asp.net/stefansedich/archive/2008/10/03/paging-with-nhibernate-using-a-custom-extension-method-to-make-it-easier.aspx</link><pubDate>Fri, 03 Oct 2008 11:28:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6656467</guid><dc:creator>stefan.sedich</dc:creator><slash:comments>13</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/stefansedich/rsscomments.aspx?PostID=6656467</wfw:commentRss><comments>http://weblogs.asp.net/stefansedich/archive/2008/10/03/paging-with-nhibernate-using-a-custom-extension-method-to-make-it-easier.aspx#comments</comments><description>&lt;p&gt;&lt;b&gt;Update 20081022:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;I have updated the articles code to reflect the bug fixes kindly suggested by Paco :). I have now used this in my project and have had no issues with it yet.&lt;/p&gt;&lt;p&gt;The fixes included clearing order by's on the count query and also returning the count as an Int64. &lt;br&gt;&lt;/p&gt;&lt;p&gt;Cheers&lt;br&gt;Stefan&lt;/p&gt;&lt;p&gt;------------------ &lt;br&gt;&lt;/p&gt;&lt;p&gt;Evening All,&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;What better thing to do on a friday night than code and blog :P. Thought it was about time I shared my custom paging helper methods for NHibernate. I quite liked this solution as it worked nicely and was easy to use. I will go into as much detail as I can here without putting you to sleep.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;br&gt;&lt;b&gt;&lt;u&gt;The Idea&lt;/u&gt;&lt;br&gt;&lt;br&gt;&lt;/b&gt;Basically my idea was to replicate something like in Linq to SQL, where you can basically define a query and call Skip(x).Take(x), in the end I came up with the idea of calling an ToPagedResult(index, pageSize); extension method, this would then return a PagedResult&amp;lt;T&amp;gt; object, the PageResult object would basically just be a container which would hold the total results and the total item count. Simple really, reason for this is just to make paging results a little easier and reduce code waste by wrapping my common functionality in my extension method.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;u&gt;&lt;b&gt;The Solution&lt;br&gt;&lt;br&gt;&lt;/b&gt;&lt;/u&gt;The solution will need 2 things, first it will need my PagedResult&amp;lt;T&amp;gt; class, and then the ToPagedResult Extension method. Firstly the PagedResult class:&lt;/p&gt;&lt;p&gt;&amp;nbsp;/// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// A paged result set, will have the items in the page of data&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// and a total item count for the total number of results.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class PagedResult&amp;lt;TEntity&amp;gt; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region Properties&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// The items for the current page.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public IList&amp;lt;TEntity&amp;gt; Items { get; protected set; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Gets the total count of items.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public long TotalItems { get; set; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region Constructor&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Initialise an instance of the paged result, &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// intiailise the internal collection.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public PagedResult() {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.Items = new List&amp;lt;TEntity&amp;gt;();&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Initialise our page result, set the items and the current page + total count&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;param name="items"&amp;gt;&amp;lt;/param&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;param name="totalItems"&amp;gt;&amp;lt;/param&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public PagedResult(IList&amp;lt;TEntity&amp;gt; items, long totalItems) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Items = items;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TotalItems = totalItems;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;br&gt;This is a simple class really just holds the page of items and the total item count, only reason for this is just a neat way to return the results. In another version of this class I have added properties for the page index, total pages properties too but in this example I kept it simple and just added what is needed.&lt;br&gt;&lt;br&gt;&lt;br&gt;Next up is the extension method, basically I have in my project an NHibernateExtensions class which holds all my common extension methods, but for the example I am only including the ToPagedResult extension, the code for this is below:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;public static class NHibernateExtensions {&lt;br&gt;&amp;nbsp;/// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Based on the ICriteria will return a paged result set, will create two copies&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// of the query 1 will be used to select the total count of items, the other&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// used to select the page of data.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// The results will be wraped in a PagedResult object which will contain&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// the items and total item count.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;typeparam name="TEntity"&amp;gt;&amp;lt;/typeparam&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;param name="criteria"&amp;gt;&amp;lt;/param&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;param name="startIndex"&amp;gt;&amp;lt;/param&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;param name="pageSize"&amp;gt;&amp;lt;/param&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static PagedResult&amp;lt;TEntity&amp;gt; ToPagedResult&amp;lt;TEntity&amp;gt;(this ICriteria criteria, int startIndex, int pageSize) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Clone a copy of the criteria, setting a projection&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // to get the row count, this will get the total number of&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // items in the query using a select count(*)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ICriteria countCriteria = CriteriaTransformer.Clone(criteria)&lt;br&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; .SetProjection(Projections.RowCountInt64());&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Clear the ordering of the results&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; countCriteria.Orders.Clear();&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Clone a copy fo the criteria to get the page of data,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // setting max and first result, this will get the page of data.s&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ICriteria pageCriteria = CriteriaTransformer.Clone(criteria)&lt;br&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .SetMaxResults(pageSize)&lt;br&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .SetFirstResult(startIndex);&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Create a new pagedresult object and populate it, use the paged query&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // to get the items, and the count query to get the total item count.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var pagedResult = new PagedResult&amp;lt;TEntity&amp;gt;(pageCriteria.List&amp;lt;TEntity&amp;gt;(),&lt;br&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;&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (long)countCriteria.UniqueResult());&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Return the result.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return pagedResult;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;The extension method works as follows, it is an extension on the ICriteria, could be made to work with DetachedCriteria too but in my case I only need it for ICriteria, based on the query it will make 2 copies using the CriteriaTransformer.Clone method, one query will be used to get the total item count, so we set a count projection on it. &lt;br&gt;&lt;br&gt;The second copy is used to get the actual page of data, it uses NHibernates SetMaxResults and SetFirstResult methods to do this, then finally we create a new instance of our PagedResult container setting the items and item count using the two queries. Finally returning the paged result.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;u&gt;&lt;b&gt;Usage Example&lt;br&gt;&lt;br&gt;&lt;/b&gt;&lt;/u&gt;To use this extension method we first define an ICriteria query and then call the extension method to get the data, and example on out People table would be something like so, the search is just getting a list of people with age &amp;gt; 20. The page to get will be 0, i.e. the first page and there will be 10 items per page.&lt;br&gt;&lt;/p&gt;&lt;p&gt;// Create the criteria to get people with age&amp;nbsp; &amp;gt; 20&lt;br&gt;ICriteria criteria = this.session.CreateCriteria(typeof (Person))&lt;br&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; .Add(Restrictions.Gt("Age", 20));&lt;br&gt;&lt;br&gt;// Get the paged result using the above criteria and our new extension method.&lt;br&gt;PagedResult&amp;lt;Person&amp;gt; pagedResult = criteria.ToPagedResult&amp;lt;Person&amp;gt;(0, 10);&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;u&gt;&lt;b&gt;Finish&lt;br&gt;&lt;br&gt;&lt;/b&gt;&lt;/u&gt;Hope you might find this useful in some of your projects, although it it something very simple it has saved me a great deal of time with paging in my project and means writing less code which is always a bonus. Send me any comments/suggestions you wish I am always open to criticism :).&lt;br&gt;&lt;br&gt;&lt;br&gt;Cheers&lt;br&gt;Stefan&lt;u&gt;&lt;b&gt;&lt;br&gt;&lt;br&gt;&lt;/b&gt;&lt;/u&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6656467" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stefansedich/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/NHibernate/default.aspx">NHibernate</category></item><item><title>Set the value of a version column in NHibernate manually</title><link>http://weblogs.asp.net/stefansedich/archive/2008/10/01/set-the-value-of-a-version-column-in-nhibernate-manually.aspx</link><pubDate>Wed, 01 Oct 2008 14:28:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6650227</guid><dc:creator>stefan.sedich</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/stefansedich/rsscomments.aspx?PostID=6650227</wfw:commentRss><comments>http://weblogs.asp.net/stefansedich/archive/2008/10/01/set-the-value-of-a-version-column-in-nhibernate-manually.aspx#comments</comments><description>&lt;span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Arial; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: pre-wrap; widows: 2; word-spacing: 0px;"&gt;My first post in a long time :), look forward to more from me. &lt;br&gt;&lt;br&gt;I am currently working on a project and for the first time am using NHibernate, I must say compared to LINQ to Sql I am in love, NHibernate ROCKS! An issue I was having was that I have a version column in my database defined as an integer and then in my NHibernate mapping files have defined a &amp;lt;version&amp;gt; element to map to this column. Now one issue is that in my service methods I do something like this:&lt;br&gt;&lt;br&gt;public void Update(MyDTO dto) {&lt;br&gt;&lt;br&gt;    // Select the item.&lt;br&gt;    var item = this.repository.SelectById(dto.Id);&lt;br&gt;&lt;br&gt;    // Map values from DTO to model.&lt;br&gt;    item.Name = dto.Name;&lt;br&gt;    item.Version = dto.Version;&lt;br&gt;&lt;br&gt;    // Call update&lt;br&gt;    this.repository.Update(item);   &lt;br&gt;&lt;br&gt;}&lt;br&gt;&lt;br&gt;Because I am passing in a DTO object from my UI layer I need to first load the entity from the repository by Id. Then I map across my properties including the version, which in this case was populated from a hidden field on the UI into the DTO. Next I call update, now my initial assumption was that this would work as I excepted for optimistic locking. I thought that for example say the current version in the DB was 2, and the item we are updating is version 1, so it would load the item with a version = 2.&lt;br&gt;&lt;br&gt;Then we override the version to 1 and upon update I would expect it to use this version 1 for the optimistic check. WRONG it from what I understand uses the version value which is cached from a copy of the item upon loading it. If you look at the documentation there are 3 types approaches to optimistic concurrency.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;10.4.1. Long session with automatic versioning&lt;br&gt;&lt;br&gt;A single ISession instance and its persistent instances are used for the whole application transaction.&lt;br&gt;&lt;br&gt;The ISession uses optimistic locking with versioning to ensure that many database transactions appear to the application as a single logical application transaction. The ISession is disconnected from any underlying ADO.NET connection when waiting for user interaction. This approach is the most efficient in terms of database access. The application need not concern itself with version checking or with reattaching detached instances.&lt;br&gt;&lt;br&gt;// foo is an instance loaded earlier by the Session&lt;br&gt;session.Reconnect();&lt;br&gt;transaction = session.BeginTransaction();&lt;br&gt;foo.Property = "bar";&lt;br&gt;session.Flush();&lt;br&gt;transaction.Commit();&lt;br&gt;session.Disconnect();&lt;br&gt;The foo object still knows which ISession it was loaded it. As soon as the ISession has an ADO.NET connection, we commit the changes to the object.&lt;br&gt;&lt;br&gt;This pattern is problematic if our ISession is too big to be stored during user think time, e.g. an HttpSession should be kept as small as possible. As the ISession is also the (mandatory) first-level cache and contains all loaded objects, we can propably use this strategy only for a few request/response cycles. This is indeed recommended, as the ISession will soon also have stale data.&lt;br&gt;&lt;br&gt;10.4.2. Many sessions with automatic versioning&lt;br&gt;&lt;br&gt;Each interaction with the persistent store occurs in a new ISession. However, the same persistent instances are reused for each interaction with the database. The application manipulates the state of detached instances originally loaded in another ISession and then "reassociates" them using ISession.Update() or ISession.SaveOrUpdate().&lt;br&gt;&lt;br&gt;// foo is an instance loaded by a previous Session&lt;br&gt;foo.Property = "bar";&lt;br&gt;session = factory.OpenSession();&lt;br&gt;transaction = session.BeginTransaction();&lt;br&gt;session.SaveOrUpdate(foo);&lt;br&gt;session.Flush();&lt;br&gt;transaction.Commit();&lt;br&gt;session.Close();&lt;br&gt;You may also call Lock() instead of Update() and use LockMode.Read (performing a version check, bypassing all caches) if you are sure that the object has not been modified.&lt;br&gt;&lt;br&gt;10.4.3. Application version checking&lt;br&gt;&lt;br&gt;Each interaction with the database occurs in a new ISession that reloads all persistent instances from the database before manipulating them. This approach forces the application to carry out its own version checking to ensure application transaction isolation. (Of course, NHibernate will still update version numbers for you.) This approach is the least efficient in terms of database access.&lt;br&gt;&lt;br&gt;// foo is an instance loaded by a previous Session&lt;br&gt;session = factory.OpenSession();&lt;br&gt;transaction = session.BeginTransaction();&lt;br&gt;int oldVersion = foo.Version;&lt;br&gt;session.Load( foo, foo.Key );&lt;br&gt;if ( oldVersion != foo.Version ) throw new StaleObjectStateException();&lt;br&gt;foo.Property = "bar";&lt;br&gt;session.Flush();&lt;br&gt;transaction.Commit();&lt;br&gt;session.close();&lt;br&gt;Of course, if you are operating in a low-data-concurrency environment and don't require version checking, you may use this approach and just skip the version check.&lt;br&gt;&lt;br&gt;-------------------&lt;br&gt;&lt;br&gt; Now if you look at the above it is clear that I am using the third scenario hence why I as having the issues, if I kept the session around for the life of the transaction i.e store in cache when you display the page and then use this session again for the save, the version would have been handled automagically same being if you had the full object and call an Update with it on a new Session. &lt;br&gt;&lt;br&gt;But in my case I do not have the full object and am only mapping over a sub set of parameters from my DTO, so I need to first load the item by ID from the session and then map across my parameters, finally calling an update, this is where the issue is. To fix this the solution which I found on the Java forums and adopted was to create an interceptor which would handle the OnFlushDirty method. In here I will compare the Version of the entity being flushed to the Version of the item in the database, this will do what I would like and allows me to set the Version manually. &lt;br&gt;&lt;br&gt;The main issue is that there is 1 extra DB call to get the version, but in my case this is minimal. The code for the interceptor is below, it doesn't seem to have any issues as yet but will undergo more testing as time goes by.  The solution/ideas came from here: http://forum.hibernate.org/viewtopic.php?t=977889, and was changed to work.&lt;br&gt;&lt;br&gt;&lt;br&gt;public class NHInterceptor : EmptyInterceptor {&lt;br&gt;        private ISession _session;&lt;br&gt;&lt;br&gt;        public override void SetSession(ISession session) {&lt;br&gt;            this._session = session;&lt;br&gt;&lt;br&gt;            base.SetSession(session);&lt;br&gt;        }&lt;br&gt;&lt;br&gt;        public override bool OnFlushDirty(object entity, object id, object[] currentState, object[] previousState, string[] propertyNames, NHibernate.Type.IType[] types) {&lt;br&gt;            ISessionImplementor sessimpl = _session.GetSessionImplementation();&lt;br&gt;            IEntityPersister persister = sessimpl.GetEntityPersister(entity);&lt;br&gt;            EntityMode mode = _session.GetSessionImplementation().EntityMode;&lt;br&gt;&lt;br&gt;            if(persister.IsVersioned) {&lt;br&gt;                object version = persister.GetVersion(entity, mode);&lt;br&gt;                object currentVersion = persister.GetCurrentVersion(id, sessimpl);&lt;br&gt;&lt;br&gt;                if (!persister.VersionType.IsEqual(currentVersion, version)) &lt;br&gt;                    throw new StaleObjectStateException(persister.EntityName, id);&lt;br&gt;            }&lt;br&gt;&lt;br&gt;            return base.OnFlushDirty(entity, id, currentState, previousState, propertyNames, types);&lt;br&gt;        }&lt;br&gt;&lt;br&gt;    } &lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;Maybe you find this useful.&lt;br&gt;&lt;br&gt;&lt;br&gt;Thanks&lt;br&gt;Stefan&lt;/span&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6650227" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stefansedich/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/NHibernate/default.aspx">NHibernate</category></item><item><title>Enhanced XMLSiteMapProvider with support for dynamic nodes.</title><link>http://weblogs.asp.net/stefansedich/archive/2008/08/14/enhanced-xmlsitemapprovider-with-support-for-dynamic-nodes.aspx</link><pubDate>Thu, 14 Aug 2008 11:43:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6517294</guid><dc:creator>stefan.sedich</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/stefansedich/rsscomments.aspx?PostID=6517294</wfw:commentRss><comments>http://weblogs.asp.net/stefansedich/archive/2008/08/14/enhanced-xmlsitemapprovider-with-support-for-dynamic-nodes.aspx#comments</comments><description>&lt;p&gt;Hello All,&lt;/p&gt;&lt;p&gt;This might be a long one so bear with me here this might bore you :).&lt;br&gt;&lt;br&gt;&lt;br&gt;I have have had the need to be able to add dynamic nodes to my sitemap, I am using a sitemap xml file. My first solution, was to create a custom sitemap provider, which would parse the XML and if it detected the node I had to insert my dynamic nodes into, it would do this and then continue.&lt;/p&gt;&lt;p&gt;Fine I thought but not good enough. I wanted a generic solution that could be reused and that would be easy to use. I came up with the idea of extending the sitemap XML file to contain some new nodes. Then create a custom parser that would make use of this. The idea in the end was to add two new elements to the sitemap, the elements being &amp;lt;dynamicNode&amp;gt; and &amp;lt;dynamicNodes&amp;gt;, the idea was that they would call a static method on a class that would either return 1 node or a collection. These would then be injected into the sitemap when it is created.&lt;/p&gt;&lt;p&gt;The beauty here was that you could add dynamic nodes to our sitemap, one other side effect was that you could now nest dynamic nodes in static nodes, and also nest static nodes in either a dynamic node, or a dynamic nodes collection. If you look at the sample project supplied you will see this works quite well. One thing to note is that any static nodes added to either a dynamic node or dynamic nodes collection. It will be added at the end. Which I think is expected behaviour, well for me anyway.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;- The new sitemap file -&lt;br&gt;&lt;br&gt;Here is an example of what the sitemap file will now look like. Say we have 3 static nodes, and within the static products node, we need to get products from our database, and add them as children. You could create an easy site map file like so:&lt;/p&gt;&lt;p&gt;&lt;br&gt;&amp;lt;siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" &amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;siteMapNode url="Default.aspx" title="Home"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;siteMapNode url="About.aspx" title="About Us" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;siteMapNode url="FAQ.aspx" title="FAQ" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;siteMapNode url="Product.aspx" title="Products"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;dynamicNodes type="Sample.MenuHelper, Sample" method="GetProducts" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/siteMapNode&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;/siteMapNode&amp;gt;&lt;br&gt;&amp;lt;/siteMap&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;Here you can see that we have added some static nodes, and within our products node, we have added a dynamicnodes, node. You can see that this calls the static method GetProducts on the MenuHelper class. This method will return a collection of nodes which will be inserted into our static nodes children. And dynamic insertion of child nodes is now possible :)... You are also able to have a dynamic node, which is a single root node, plus you can nest until your heart is content, which you will see in the sample.&lt;br&gt;&lt;br&gt;-- MenuHelper --&lt;br&gt;&lt;br&gt;In this class we would have a static GetProducts method, this would return a list of XX objects. These objects are helpers, they allow us to create a collection of sitemap nodes, so that they can be used in the provider to build up the sitemap. The node has the default properties (key,url,title,description) and you can add custom attributes too. The method would look like so, you could imagine this would use the database to get products and build up the list.&lt;br&gt;&lt;br&gt;public static List&amp;lt;EnhancedXMLSiteMapProvider.EnhancedSiteMapNode&amp;gt; GetProducts() {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return new List&amp;lt;EnhancedXMLSiteMapProvider.EnhancedSiteMapNode&amp;gt;() {&lt;br&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;&amp;nbsp;&amp;nbsp; new EnhancedXMLSiteMapProvider.EnhancedSiteMapNode() {&lt;br&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Key="Product1.aspx",&lt;br&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Url="Product1.aspx",&lt;br&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Title="Product 1"&lt;br&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&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;br&gt;}&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;-- Web.Config Configuration --&lt;br&gt;&lt;br&gt;You need to configure the provider in the web.config. In the sample project this is done as so:&lt;br&gt;&lt;br&gt;&amp;lt;siteMap defaultProvider="EnhancedXMLSiteMapProvider"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;providers&amp;gt;&lt;br&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;lt;add name="EnhancedXMLSiteMapProvider" type="EnhancedXMLSiteMapProviderSample.EnhancedXMLSiteMapProvider, EnhancedXMLSiteMapProviderSample" &lt;br&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; siteMapFile="~/Web.sitemap"&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cacheDuration="15"/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/providers&amp;gt;&lt;br&gt;&amp;lt;/siteMap&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;I am basically setting it as the default provider, I am pointing it to the xml sitemap file, and setting the cache duration (this defaults to 5 if not set). Once this is done you are ready to run. One thing to note is that the provider also puts a dependancy on the xml file, so that once changed it invalidates the sitemap. And also after the time duration. &lt;br&gt;&lt;br&gt;One issue is that any dynamic data does not invalidate the cache, you are able to set a cacheKey on the provider which is used for caching. Then you can use code to remove the item. So you backend could remove the cache item when it needs the menu to change.&lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;-- The Provider --&lt;br&gt;&lt;br&gt;I am not going to go into full detail on the provider and show all the code, it is all included in the sample project so just have a look. Basically the main workings, just parses the XML file, depending on the node type will do different things. If it encounters a dynamicNode or dynamicNodes element it will grab the type and method attributes, and use reflection to call these methods and continue parsing the data. &lt;br&gt;&lt;br&gt;I have tested this with many levels/combinations of nodes and I have not had any issues yet, mind you I know this needs neatening up and it is only the efforts of a days work. I will post updates as I go and any bug fixes to this. But at the moment I am happy with where it is.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;-- Final Word --&lt;/p&gt;&lt;p&gt;The sample project is supplied below, have a play and let me know what you think. Also this is the first time I have ever used the site map provider, so if I have just reinvented the wheel please give me a gentle slap and let me know :). &lt;/p&gt;&lt;p&gt;Sample Project Files&lt;br&gt;------------------------------------------------------------&lt;br&gt;&lt;a href="http://weblogs.asp.net/blogs/stefansedich/EnhancedXMLSiteMapProviderSample.zip" mce_href="http://weblogs.asp.net/blogs/stefansedich/EnhancedXMLSiteMapProviderSample.zip"&gt;EnhancedXMLSiteMapProviderSample.zip&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;Cheers&lt;br&gt;Stefan&lt;br&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6517294" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stefansedich/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/MICROSOFT/default.aspx">MICROSOFT</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/XML/default.aspx">XML</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/Configuration/default.aspx">Configuration</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/Sitemap/default.aspx">Sitemap</category></item><item><title>Nullable ConvertTo Extension Method</title><link>http://weblogs.asp.net/stefansedich/archive/2008/08/12/nullable-convertto-extension-method.aspx</link><pubDate>Tue, 12 Aug 2008 06:21:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6507126</guid><dc:creator>stefan.sedich</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/stefansedich/rsscomments.aspx?PostID=6507126</wfw:commentRss><comments>http://weblogs.asp.net/stefansedich/archive/2008/08/12/nullable-convertto-extension-method.aspx#comments</comments><description>&lt;p&gt;Hello,&lt;/p&gt;&lt;p&gt;I have the need to easily convert a string to another type i.e. int. And would like to return null if the string is empty. I created a quick extension method, thought id post it up incase anyone finds it helpful.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Converts a string value to the given type, if the string is empty, &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// will return null.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;typeparam name="T"&amp;gt;&amp;lt;/typeparam&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;param name="input"&amp;gt;&amp;lt;/param&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static T? ConvertTo&amp;lt;T&amp;gt;(this string input) where T : struct {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; T? ret = null;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!string.IsNullOrEmpty(input)) {&lt;br&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; ret = (T)Convert.ChangeType(input, typeof(T));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return ret;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt; &lt;br&gt;&lt;/p&gt;&lt;p&gt;Basically to use this, just call the extension method on a string:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;br&gt;"12".ConvertTo&amp;lt;int&amp;gt;(); // Returns 12&lt;br&gt;"".ConvertTo&amp;lt;int&amp;gt;(); // Returns null&lt;br&gt;"1ddsfs".ConvertTo&amp;lt;int&amp;gt;(); // Exception thrown (behaviour I wanted)&lt;br&gt;&lt;br&gt;&lt;br&gt;Just a quick one today, will be posting some more useful things in the weeks to come.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;Cheers&lt;br&gt;Stefan&lt;br&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6507126" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stefansedich/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/MICROSOFT/default.aspx">MICROSOFT</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>Long time no post :(</title><link>http://weblogs.asp.net/stefansedich/archive/2008/07/13/long-time-no-post.aspx</link><pubDate>Sun, 13 Jul 2008 10:21:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6396240</guid><dc:creator>stefan.sedich</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/stefansedich/rsscomments.aspx?PostID=6396240</wfw:commentRss><comments>http://weblogs.asp.net/stefansedich/archive/2008/07/13/long-time-no-post.aspx#comments</comments><description>&lt;p&gt;Hello All,&lt;/p&gt;&lt;p&gt;I must say I have been slack, I have not had a post in a long time. I am still alive just have not had the time/motivation to keep this upto date like I had planned.&lt;/p&gt;&lt;p&gt;I am going to hit the road hard again and I hope to be blogging again in the next few weeks. Look forward to sharing my findings with everyone once again.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Cheers&lt;br&gt;Stefan &lt;br&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6396240" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stefansedich/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>Urchin ELF2 Ecommecre Log File Helper</title><link>http://weblogs.asp.net/stefansedich/archive/2008/04/04/urchin-elf2-ecommecre-log-file-helper.aspx</link><pubDate>Fri, 04 Apr 2008 12:25:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6064759</guid><dc:creator>stefan.sedich</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/stefansedich/rsscomments.aspx?PostID=6064759</wfw:commentRss><comments>http://weblogs.asp.net/stefansedich/archive/2008/04/04/urchin-elf2-ecommecre-log-file-helper.aspx#comments</comments><description>&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;Hello,&lt;br&gt;&lt;br&gt;I am currently needing to implement ecommerce tracking with our Urchin stats server. To do this it reads your transaction logs that you write to when users buy from your site. This file needs to be in a special format ELF2 &lt;a href="http://www.google.com/support/urchin45/bin/answer.py?answer=28448" target="_blank" mce_href="http://www.google.com/support/urchin45/bin/answer.py?answer=28448"&gt;click here for more info&lt;/a&gt;.&lt;br&gt;&lt;br&gt;I though I would write some helper classes to make writing my ELF2 logs easier and something that would be reusable and could even have functionality added in the future to parse the logs (most likely never needed but you never know). So I created a set of classes to do this for me. I will not post the source code right now but if there is interest will tidy it up and release it for all too use.&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;Adding a new order to a transaction record to your log is as easy as pie:&lt;br&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;

&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(43, 145, 175);"&gt;ELF2TransactionLog&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt; log = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ELF2TransactionLog&lt;/span&gt;();&lt;/span&gt;





























































&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;log.TransactionLines.Add(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ELF2LogTransactionLine&lt;/span&gt;()
{&lt;br&gt;&lt;span style=""&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; &lt;/span&gt;OrderID = &lt;span style="color: rgb(163, 21, 21);"&gt;"100"&lt;/span&gt;,&lt;br&gt;&lt;span style=""&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; &lt;/span&gt;RemoteHost = &lt;span style="color: rgb(163, 21, 21);"&gt;"GETIPHERE"&lt;/span&gt;,&lt;br&gt;&lt;span style=""&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; &lt;/span&gt;UserAgent =
Request.ServerVariables[&lt;span style="color: rgb(163, 21, 21);"&gt;"HTTP_USER_AGENT"&lt;/span&gt;].ToString(),&lt;br&gt;&lt;span style=""&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; &lt;/span&gt;Store = &lt;span style="color: rgb(163, 21, 21);"&gt;"My Store"&lt;/span&gt;,&lt;br&gt;&lt;span style=""&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; &lt;/span&gt;SessionID = &lt;span style="color: rgb(163, 21, 21);"&gt;"000-111"&lt;/span&gt;,&lt;span style=""&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; &lt;br&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; &lt;/span&gt;Total = 895,&lt;br&gt;&lt;span style=""&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; &lt;/span&gt;Tax = 10,&lt;br&gt;&lt;span style=""&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; &lt;/span&gt;Shipping = 10,&lt;br&gt;&lt;span style=""&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; &lt;/span&gt;BillCity = &lt;span style="color: rgb(163, 21, 21);"&gt;"Perth"&lt;/span&gt;,&lt;br&gt;&lt;span style=""&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; &lt;/span&gt;BillState = &lt;span style="color: rgb(163, 21, 21);"&gt;"WA"&lt;/span&gt;,&lt;br&gt;&lt;span style=""&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; &lt;/span&gt;BillZip = &lt;span style="color: rgb(163, 21, 21);"&gt;"6025"&lt;/span&gt;,&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=""&gt;&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;BillCountry = &lt;span style="color: rgb(163, 21, 21);"&gt;"Australia"&lt;/span&gt;,&lt;br&gt;&lt;span style=""&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; &lt;/span&gt;Cookies = &lt;span style="color: rgb(163, 21, 21);"&gt;"GETCOOKIESHERE :)"&lt;/span&gt;,&lt;br&gt;&lt;span style=""&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; &lt;/span&gt;LineItems = {&lt;br&gt;&lt;span style=""&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;
&lt;span style="color: rgb(43, 145, 175);"&gt;ELF2LogTransactionItemLine&lt;/span&gt;() {&lt;br&gt;&lt;span style=""&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;OrderID = &lt;span style="color: rgb(163, 21, 21);"&gt;"100"&lt;/span&gt;,&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;br&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;ProductCode = &lt;span style="color: rgb(163, 21, 21);"&gt;"test1"&lt;/span&gt;,&lt;br&gt;&lt;span style=""&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;ProductName = &lt;span style="color: rgb(163, 21, 21);"&gt;"Test Product 1"&lt;/span&gt;,&lt;br&gt;&lt;span style=""&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Variation = &lt;span style="color: rgb(163, 21, 21);"&gt;""&lt;/span&gt;,&lt;br&gt;&lt;span style=""&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Price = 100M,&lt;br&gt;&lt;span style=""&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Quantity = 1,&lt;br&gt;&lt;span style=""&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;UpSold = &lt;span style="color: blue;"&gt;false&lt;/span&gt;,&lt;br&gt;&lt;span style=""&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;UserAgent =
Request.ServerVariables[&lt;span style="color: rgb(163, 21, 21);"&gt;"HTTP_USER_AGENT"&lt;/span&gt;].ToString(),&lt;br&gt;&lt;span style=""&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Cookies = &lt;span style="color: rgb(163, 21, 21);"&gt;"GETCOOKIESHERE"&lt;/span&gt;,&lt;br&gt;&lt;span style=""&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;RemoteHost = &lt;span style="color: rgb(163, 21, 21);"&gt;"GETIPHERE"&lt;/span&gt;&lt;br&gt;&lt;span style=""&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;&lt;span style=""&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; &lt;/span&gt;}&lt;br&gt;&lt;span style=""&gt;&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;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;br&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&lt;/span&gt;log.Save(Server.MapPath(&lt;span style="color: rgb(163, 21, 21);"&gt;"~/biglog.log"&lt;/span&gt;), &lt;span style="color: blue;"&gt;true&lt;/span&gt;);&lt;/span&gt;&lt;/p&gt;

&lt;br&gt;&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;Thanks&lt;br&gt;Stefan&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6064759" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stefansedich/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/Urchin/default.aspx">Urchin</category></item></channel></rss>