<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://nhforge.org/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>NHibernate blog : validation</title><link>http://nhforge.org/blogs/nhibernate/archive/tags/validation/default.aspx</link><description>Tags: validation</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>NHibernate Validator 1.2 Beta3 released</title><link>http://nhforge.org/blogs/nhibernate/archive/2009/10/26/nhibernate-validator-1-2-beta3-released.aspx</link><pubDate>Mon, 26 Oct 2009 16:12:00 GMT</pubDate><guid isPermaLink="false">45f813f2-f1c4-4eda-a619-288e3cadc793:534</guid><dc:creator>Dario Quintana</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://nhforge.org/blogs/nhibernate/rsscomments.aspx?PostID=534</wfw:commentRss><comments>http://nhforge.org/blogs/nhibernate/archive/2009/10/26/nhibernate-validator-1-2-beta3-released.aspx#comments</comments><description>&lt;p&gt;&lt;img src="http://darioquintana.com.ar/files/NHV-logo-white-background.png" alt="" /&gt;

&lt;/p&gt;
&lt;p&gt;Download NHibernate Validator 1.2 beta3 with sources, binaries and example here &lt;a href="https://sourceforge.net/projects/nhcontrib/files"&gt;here&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;For use it with NHibernate 2.1 GA.
&lt;/p&gt;
&lt;p&gt;For examples and documentation see the serie of blog posts of Fabio Maulo about NHibernate Validator &lt;a href="http://fabiomaulo.blogspot.com/search/label/Validator"&gt;here&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://nhforge.org/aggbug.aspx?PostID=534" width="1" height="1"&gt;</description><category domain="http://nhforge.org/blogs/nhibernate/archive/tags/validation/default.aspx">validation</category><category domain="http://nhforge.org/blogs/nhibernate/archive/tags/News/default.aspx">News</category><category domain="http://nhforge.org/blogs/nhibernate/archive/tags/Release/default.aspx">Release</category><category domain="http://nhforge.org/blogs/nhibernate/archive/tags/Validator/default.aspx">Validator</category></item><item><title>NHibernate Validator 1.2 Beta2 released</title><link>http://nhforge.org/blogs/nhibernate/archive/2009/10/10/nhibernate-validator-1-2-beta2-released.aspx</link><pubDate>Sat, 10 Oct 2009 18:16:00 GMT</pubDate><guid isPermaLink="false">45f813f2-f1c4-4eda-a619-288e3cadc793:523</guid><dc:creator>Dario Quintana</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://nhforge.org/blogs/nhibernate/rsscomments.aspx?PostID=523</wfw:commentRss><comments>http://nhforge.org/blogs/nhibernate/archive/2009/10/10/nhibernate-validator-1-2-beta2-released.aspx#comments</comments><description>&lt;p&gt;&lt;img src="http://darioquintana.com.ar/files/NHV-logo-white-background.png" alt="" /&gt;

&lt;/p&gt;
&lt;p&gt;Download NHibernate Validator 1.2 beta2 with sources, binaries and example here &lt;a href="https://sourceforge.net/projects/nhcontrib/files"&gt;here&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;For use it with NHibernate 2.1 GA.
&lt;/p&gt;
&lt;p&gt;
Enjoy it !&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://nhforge.org/aggbug.aspx?PostID=523" width="1" height="1"&gt;</description><category domain="http://nhforge.org/blogs/nhibernate/archive/tags/validation/default.aspx">validation</category><category domain="http://nhforge.org/blogs/nhibernate/archive/tags/News/default.aspx">News</category><category domain="http://nhforge.org/blogs/nhibernate/archive/tags/Validator/default.aspx">Validator</category></item><item><title>Nhibernate and WPF: Validations</title><link>http://nhforge.org/blogs/nhibernate/archive/2009/08/27/nhibernate-and-wpf-validations.aspx</link><pubDate>Fri, 28 Aug 2009 01:06:36 GMT</pubDate><guid isPermaLink="false">45f813f2-f1c4-4eda-a619-288e3cadc793:493</guid><dc:creator>Jose Romaniello</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://nhforge.org/blogs/nhibernate/rsscomments.aspx?PostID=493</wfw:commentRss><comments>http://nhforge.org/blogs/nhibernate/archive/2009/08/27/nhibernate-and-wpf-validations.aspx#comments</comments><description>&lt;p&gt;Part I: &lt;a href="http://jfromaniello.blogspot.com/2009/08/introducing-nhiberate-and-wpf.html"&gt;Introducing NHiberate and WPF: The ChinookMediaManager&lt;/a&gt;     &lt;br /&gt;Part II: &lt;a href="http://jfromaniello.blogspot.com/2009/08/chinook-media-manager-core.html"&gt;Nhibernate and WPF: The core&lt;/a&gt;     &lt;br /&gt;Part III: &lt;a href="http://nhforge.org/blogs/nhibernate/archive/2009/08/15/nhibernate-and-wpf-models-concept.aspx"&gt;Nhibernate and WPF: Models concept&lt;/a&gt;     &lt;br /&gt;Part IV :&lt;a href="http://jfromaniello.blogspot.com/2009/08/nhibernate-and-wpf-viewmodels-and-views.html"&gt;Nhibernate and WPF: ViewModels and Views&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In this post I will show you an easy way to handle validations in WPF.&lt;/p&gt;  &lt;p&gt;In System.ComponentModel we have an interesting interface named &lt;a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.idataerrorinfo.aspx"&gt;IDataErrorInfo&lt;/a&gt;.     &lt;br /&gt;This interface has two members:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;IDataErrorInfo.Item: Gets the error message for the property with the given name. &lt;/li&gt;    &lt;li&gt;IDataErrorInfo.Error: Gets an error message indicating what is wrong with this object. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The interesting side of this interface is that if we implement this in our domain classes, the presentation layer will automatically resolved certain things.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Side note: This interface was made with DataTables in mind. &lt;/p&gt; &lt;/blockquote&gt;  &lt;h4&gt;Validation Framework&lt;/h4&gt;  &lt;p&gt;I really like NHibernateValidator, in the same way that I like NHibernate. But, in uNhAddIns we have a main principle: “those two are just options”, so you can change whenever you want to use anything else (&lt;a href="http://msdn.microsoft.com/en-us/library/cc309509.aspx"&gt;Validation Application Block&lt;/a&gt;, &lt;a href="http://www.codeplex.com/ValidationFramework"&gt;Validation Framework&lt;/a&gt;, &lt;a href="http://www.castleproject.org/ActiveRecord/documentation/v1rc1/manual/validators.html"&gt;Castle Validators&lt;/a&gt;, &lt;a href="http://www.codeplex.com/xval"&gt;xVal&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;For that matter, &lt;a href="http://fabiomaulo.blogspot.com/"&gt;Fabio Maulo&lt;/a&gt; developed a simple interface named &lt;a href="http://code.google.com/p/unhaddins/source/browse/trunk/uNhAddIns/uNhAddIns.Adapters/IEntityValidator.cs"&gt;IEntityValidator&lt;/a&gt;, this is part now of the uNhAddIns.Adapters project. If you want to use Nhibernate Validator the EntityValidator is already implemented &lt;a href="http://code.google.com/p/unhaddins/source/browse/#svn/trunk/uNhAddIns/uNhAddIns.NHibernateValidator"&gt;here&lt;/a&gt;. If you want to use another validator framework please implement the interface and send us the patch ;-).&lt;/p&gt;  &lt;h4&gt;How To &lt;/h4&gt;  &lt;p&gt;Implementing IDataErrorInfo directly in domain classes is a waste of time and also is too much invasive, because will end with a dependency in the IEntityValidator. Since we already know how to build injectable behavior we can address this problem in the same way.&lt;/p&gt;  &lt;p&gt;I build a new DynamicProxy IInterceptor you could see the implementation &lt;a href="http://code.google.com/p/unhaddins/source/browse/trunk/uNhAddIns/uNhAddIns.ComponentBehaviors.Castle/DataErrorInfoInterceptor.cs"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The configuration of the Album entity, now looks as follows:&lt;/p&gt;  &lt;pre class="code"&gt;container.Register(&lt;span style="color:#2b91af;"&gt;Component&lt;/span&gt;.For&amp;lt;&lt;span style="color:#2b91af;"&gt;Album&lt;/span&gt;&amp;gt;()
                                    .NhibernateEntity()
                                    .AddDataErrorInfoBehavior()
                                    .AddNotificableBehavior()
                                    .LifeStyle.Transient);&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;The configuration of Nhibernate.Validator is very easy and &lt;a href="http://nhforge.org/wikis/howtonh/setup-nhv-fluently-with-your-ioc-container.aspx"&gt;I don’t want to repeat myself&lt;/a&gt;. 

  &lt;br /&gt;Then you need to register an IEntityValidator as follows:&lt;/p&gt;

&lt;pre class="code"&gt;container.Register(&lt;span style="color:#2b91af;"&gt;Component&lt;/span&gt;.For&amp;lt;&lt;span style="color:#2b91af;"&gt;IEntityValidator&lt;/span&gt;&amp;gt;()
                            .ImplementedBy&amp;lt;&lt;span style="color:#2b91af;"&gt;EntityValidator&lt;/span&gt;&amp;gt;());&lt;/pre&gt;

&lt;p&gt;You have three way to write validations with NHibernate Validator: Xml, Fluent and Attributes. This is aleady very well explained in this &lt;a href="http://fabiomaulo.blogspot.com/2009/02/diving-in-nhibernatevalidator.html"&gt;post&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In the VIEW the only thing that we need to enable is the ValidateOnDataErrors attribute, this is an example textbox:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;TextBox &lt;/span&gt;&lt;span style="color:red;"&gt;Text&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Binding &lt;/span&gt;&lt;span style="color:red;"&gt;Path&lt;/span&gt;&lt;span style="color:blue;"&gt;=Album.Title, &lt;/span&gt;&lt;span style="color:red;"&gt;ValidatesOnDataErrors&lt;/span&gt;&lt;span style="color:blue;"&gt;=true}&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;I’ve a shared a resource for views, as follows:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Style &lt;/span&gt;&lt;span style="color:red;"&gt;TargetType&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515;"&gt;x&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Type &lt;/span&gt;&lt;span style="color:red;"&gt;TextBox&lt;/span&gt;&lt;span style="color:blue;"&gt;}&amp;quot;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Style.Triggers&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Trigger &lt;/span&gt;&lt;span style="color:red;"&gt;Property&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Validation.HasError&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;Value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;true&amp;quot;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Setter &lt;/span&gt;&lt;span style="color:red;"&gt;Property&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;ToolTip&amp;quot;
            &lt;/span&gt;&lt;span style="color:red;"&gt;Value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Binding &lt;/span&gt;&lt;span style="color:red;"&gt;RelativeSource&lt;/span&gt;&lt;span style="color:blue;"&gt;={&lt;/span&gt;&lt;span style="color:#a31515;"&gt;RelativeSource &lt;/span&gt;&lt;span style="color:red;"&gt;Self&lt;/span&gt;&lt;span style="color:blue;"&gt;}, 
                   &lt;/span&gt;&lt;span style="color:red;"&gt;Path&lt;/span&gt;&lt;span style="color:blue;"&gt;=(Validation.Errors)[&lt;/span&gt;0&lt;span style="color:blue;"&gt;].ErrorContent}&amp;quot;/&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Trigger&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Style.Triggers&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Style&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;This means: “textbox should display validation errors in tooltip”. 

&lt;br /&gt;

&lt;br /&gt;This is all. What?, you don’t believe me. 

&lt;br /&gt;

&lt;br /&gt;

&lt;h3&gt;See the behavior in action&lt;/h3&gt;
See the screencast &lt;a href="http://www.screencast.com/t/wSG2lhGbiJ6F"&gt;here&lt;/a&gt;. 

&lt;p&gt;Oh, and I almost forgot, this behavior &lt;a href="http://www.asp.net/Learn/mvc/tutorial-37-cs.aspx"&gt;should also work in ASP.NET Mvc&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://nhforge.org/aggbug.aspx?PostID=493" width="1" height="1"&gt;</description><category domain="http://nhforge.org/blogs/nhibernate/archive/tags/validation/default.aspx">validation</category><category domain="http://nhforge.org/blogs/nhibernate/archive/tags/Castle/default.aspx">Castle</category><category domain="http://nhforge.org/blogs/nhibernate/archive/tags/uNHAddins/default.aspx">uNHAddins</category><category domain="http://nhforge.org/blogs/nhibernate/archive/tags/Validator/default.aspx">Validator</category><category domain="http://nhforge.org/blogs/nhibernate/archive/tags/WPF/default.aspx">WPF</category></item><item><title>NHibernate Validator 1.2.0 Beta1 released</title><link>http://nhforge.org/blogs/nhibernate/archive/2009/07/20/nhibernate-validator-1-2-0-beta1-released.aspx</link><pubDate>Mon, 20 Jul 2009 19:35:00 GMT</pubDate><guid isPermaLink="false">45f813f2-f1c4-4eda-a619-288e3cadc793:425</guid><dc:creator>Dario Quintana</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://nhforge.org/blogs/nhibernate/rsscomments.aspx?PostID=425</wfw:commentRss><comments>http://nhforge.org/blogs/nhibernate/archive/2009/07/20/nhibernate-validator-1-2-0-beta1-released.aspx#comments</comments><description>&lt;p&gt;&lt;img src="http://darioquintana.com.ar/files/NHV-logo-white-background.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://sourceforge.net/projects/nhcontrib/files/"&gt;Download binaries, source and examples here&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://sourceforge.net/project/shownotes.php?group_id=216446&amp;amp;release_id=698445"&gt;
Read the release notes of this release here: &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Remember you can see examples in our quickstart.&lt;/p&gt;
&lt;p&gt;This release of NHibernate Validator is ready to use it with NHibernate 2.1GA. 
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://nhforge.org/aggbug.aspx?PostID=425" width="1" height="1"&gt;</description><category domain="http://nhforge.org/blogs/nhibernate/archive/tags/validation/default.aspx">validation</category><category domain="http://nhforge.org/blogs/nhibernate/archive/tags/News/default.aspx">News</category><category domain="http://nhforge.org/blogs/nhibernate/archive/tags/Release/default.aspx">Release</category><category domain="http://nhforge.org/blogs/nhibernate/archive/tags/Validator/default.aspx">Validator</category></item><item><title>NHibernate Validator 1.2.0 Alpha4 released</title><link>http://nhforge.org/blogs/nhibernate/archive/2009/07/05/nhibernate-validator-1-2-0-alpha4-released.aspx</link><pubDate>Sun, 05 Jul 2009 18:21:00 GMT</pubDate><guid isPermaLink="false">45f813f2-f1c4-4eda-a619-288e3cadc793:403</guid><dc:creator>Dario Quintana</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://nhforge.org/blogs/nhibernate/rsscomments.aspx?PostID=403</wfw:commentRss><comments>http://nhforge.org/blogs/nhibernate/archive/2009/07/05/nhibernate-validator-1-2-0-alpha4-released.aspx#comments</comments><description>&lt;p&gt;&lt;img src="http://darioquintana.com.ar/files/NHV-logo-white-background.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;This release of NHibernate Validator is for use it with NHibernate 2.1CR1. 
&lt;/p&gt;
&lt;p&gt;Download binaries, source and examples here: &lt;a href="http://tinyurl.com/ph9q7a"&gt;http://tinyurl.com/ph9q7a&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Read the release notes of this release here: &lt;a href="http://tinyurl.com/olswlw"&gt;http://tinyurl.com/olswlw&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://nhforge.org/aggbug.aspx?PostID=403" width="1" height="1"&gt;</description><category domain="http://nhforge.org/blogs/nhibernate/archive/tags/validation/default.aspx">validation</category><category domain="http://nhforge.org/blogs/nhibernate/archive/tags/News/default.aspx">News</category><category domain="http://nhforge.org/blogs/nhibernate/archive/tags/Release/default.aspx">Release</category><category domain="http://nhforge.org/blogs/nhibernate/archive/tags/Validator/default.aspx">Validator</category></item><item><title>NHibernate Validator Quickstart</title><link>http://nhforge.org/blogs/nhibernate/archive/2009/05/18/nhibernate-validator-quickstart.aspx</link><pubDate>Mon, 18 May 2009 04:31:00 GMT</pubDate><guid isPermaLink="false">45f813f2-f1c4-4eda-a619-288e3cadc793:308</guid><dc:creator>Dario Quintana</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://nhforge.org/blogs/nhibernate/rsscomments.aspx?PostID=308</wfw:commentRss><comments>http://nhforge.org/blogs/nhibernate/archive/2009/05/18/nhibernate-validator-quickstart.aspx#comments</comments><description>&lt;p&gt;&lt;img src="http://darioquintana.com.ar/files/NHV-logo-white-background.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;The NHibernate Validator Team had prepared examples to you be able to use this validation framework in a easy way. With four examples we are covering the following topics:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;1) Winforms&lt;/h3&gt;
&lt;p&gt;In this example you will how you can easily integrate NHibernate Validator and some helper clases with System.Windows.Forms.&lt;/p&gt;
&lt;h3&gt;2) NHibernate Integration&lt;/h3&gt;
&lt;p&gt;Trying to integrate NHibernate Validator with NHibernate? Not a problem. In this example you will how really get these 2 great frameworks working together. NHibernate Validator let you intercept Saves and Updates from NHibernate validating your entities before these changes take place. Note you have to create a database based on the configured connection string.&lt;/p&gt;
&lt;h3&gt;3) Asp.Net MVC&lt;/h3&gt;
&lt;p&gt;Asp.Net MVC has a cool way to add validation errors from model and display them all into the View. This example cover the easy integration between these frameworks. Note, you need Asp.Net MVC installed into your machine.&lt;a title="Download Asp.net MVC" href="http://www.asp.net/mvc/"&gt;Download Asp.net MVC&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;4) Entity Validator&lt;/h3&gt;
&lt;p&gt;Sometimes you need to validate a property which depends of another(s) property(ies). The most common example is when you have to validate a range of dates. This example cover this funcionality and show to us how to configurate it using attributes, xml and fluent.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;&lt;a href="https://sourceforge.net/project/showfiles.php?group_id=216446&amp;amp;package_id=275108"&gt;Download it here&lt;/a&gt;&lt;/h2&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://nhforge.org/aggbug.aspx?PostID=308" width="1" height="1"&gt;</description><category domain="http://nhforge.org/blogs/nhibernate/archive/tags/validation/default.aspx">validation</category><category domain="http://nhforge.org/blogs/nhibernate/archive/tags/Validator/default.aspx">Validator</category><category domain="http://nhforge.org/blogs/nhibernate/archive/tags/examples/default.aspx">examples</category><category domain="http://nhforge.org/blogs/nhibernate/archive/tags/quickstart/default.aspx">quickstart</category></item><item><title>NHibernate Validator</title><link>http://nhforge.org/blogs/nhibernate/archive/2009/05/01/nhibernate-validator.aspx</link><pubDate>Fri, 01 May 2009 08:28:00 GMT</pubDate><guid isPermaLink="false">45f813f2-f1c4-4eda-a619-288e3cadc793:268</guid><dc:creator>Ayende</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://nhforge.org/blogs/nhibernate/rsscomments.aspx?PostID=268</wfw:commentRss><comments>http://nhforge.org/blogs/nhibernate/archive/2009/05/01/nhibernate-validator.aspx#comments</comments><description>&lt;p&gt;Validation is one of those things that goes hand in hand with data access. I guess it is not much of surprise that one of the contrib projects for NHibernate is extensive validation support.&lt;/p&gt;  &lt;p&gt;True, there are about as many validation frameworks as there are ToDo applications, but NHibernate Validator bring something special to the table, it brings tight integration with NHibernate itself and:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“…multi-layered data validation, where constraints are expressed in a single place and checked in various different layers of the application.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I am sorry, I just love this quote. :-)&lt;/p&gt;  &lt;p&gt;Anyway, let me jump right it and show you what I mean by that.&lt;/p&gt;  &lt;p&gt;We can initialize the validation framework using &lt;a href="http://nhforge.org/wikis/validator/nhibernate-validator-1-0-0-documentation.aspx"&gt;several ways&lt;/a&gt;, but probably the easier would be:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;var configuration = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Configuration()
	.Configure(&amp;quot;&lt;span style="color:#8b0000;"&gt;hibernate.cfg.xml&lt;/span&gt;&amp;quot;);

var engine = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ValidatorEngine();
engine.Configure(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; NHVConfigurationBase());

ValidatorInitializer.Initialize(configuration, engine);&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;And now, all we need to do is set the validation attributes on our the entities, and we are done:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;[NotNullNotEmpty]
[Length(25)]
&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;virtual&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Title&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;At this point, several very interesting things are going to happen. First, if we ask NHibernate to generate the schema for us we are going to get the following:&lt;/p&gt;

&lt;table cellspacing="0" cellpadding="2" width="400" border="0"&gt;&lt;tbody&gt;
    &lt;tr&gt;
      &lt;td valign="top" width="200"&gt;Before using NHV&lt;/td&gt;

      &lt;td valign="top" width="200"&gt;After using NHV&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="200"&gt;
        &lt;pre&gt;&lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=create&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;create&lt;/a&gt; &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=table&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;table&lt;/a&gt; Blogs (
  Id &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=INT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;INT&lt;/a&gt; &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=IDENTITY&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;IDENTITY&lt;/a&gt; &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=NOT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;NOT&lt;/a&gt; &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=NULL&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;NULL&lt;/a&gt;,
   &lt;strong&gt;Title &lt;/strong&gt;&lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=NVARCHAR&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;&lt;strong&gt;NVARCHAR&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;(255) &lt;/strong&gt;&lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=null&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;&lt;strong&gt;null&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;,&lt;/strong&gt;
   Subtitle &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=NVARCHAR&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;NVARCHAR&lt;/a&gt;(255) &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=null&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;null&lt;/a&gt;,
   AllowsComments &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=BIT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;BIT&lt;/a&gt; &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=null&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;null&lt;/a&gt;,
   CreatedAt &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=DATETIME&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;DATETIME&lt;/a&gt; &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=null&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;null&lt;/a&gt;,
   &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=primary&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;primary&lt;/a&gt; &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=key&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;key&lt;/a&gt; (Id)
)&lt;/pre&gt;
      &lt;/td&gt;

      &lt;td valign="top" width="200"&gt;
        &lt;pre&gt;&lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=create&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;create&lt;/a&gt; &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=table&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;table&lt;/a&gt; Blogs (
   Id &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=INT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;INT&lt;/a&gt; &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=IDENTITY&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;IDENTITY&lt;/a&gt; &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=NOT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;NOT&lt;/a&gt; &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=NULL&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;NULL&lt;/a&gt;,
   &lt;strong&gt;Title &lt;/strong&gt;&lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=NVARCHAR&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;&lt;strong&gt;NVARCHAR&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;(25) &lt;/strong&gt;&lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=not&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;&lt;strong&gt;not&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; &lt;/strong&gt;&lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=null&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;&lt;strong&gt;null&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;,&lt;/strong&gt;
   Subtitle &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=NVARCHAR&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;NVARCHAR&lt;/a&gt;(255) &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=null&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;null&lt;/a&gt;,
   AllowsComments &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=BIT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;BIT&lt;/a&gt; &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=null&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;null&lt;/a&gt;,
   CreatedAt &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=DATETIME&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;DATETIME&lt;/a&gt; &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=null&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;null&lt;/a&gt;,
   &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=primary&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;primary&lt;/a&gt; &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=key&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;key&lt;/a&gt; (Id)
)&lt;/pre&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;Note the title column, where before we used the default values (null and 255) we are now using the values defined in the validation scheme. That is what we mean when we say that we can get pretty multi layered data validation.&lt;/p&gt;

&lt;p&gt;That is not the end of it, however, NHibernate Validator is hooking up into the NHibernate engine, and if we tried to save the following, we will get a validation exception:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;s.Save(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Blog
{
	Title = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;(&amp;#39;*&amp;#39;,255),
});&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;And, obviously, we support a way to extract all the validation errors from the entity:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;var invalidValues = engine.Validate(blog);
&lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (var invalidValue &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; invalidValues)
{
	Console.WriteLine(
        &amp;quot;&lt;span style="color:#8b0000;"&gt;{0}: {1}&lt;/span&gt;&amp;quot;,
		invalidValue.PropertyName, 
		invalidValue.Message);
}&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;NHibernate Validator also support all the other things that you would expect from validation frameworks, the ability to create your own constraints (including the ability to embed them in the database schema!), i18n, XML only configuration, if you want to keep your entities clear of attributes, etc.&lt;/p&gt;

&lt;p&gt;This has been truly just a tidbit, to whet your appetite. &lt;/p&gt;

&lt;p&gt;You can learn more about NH Validator &lt;a href="http://nhforge.org/wikis/validator/nhibernate-validator-1-0-0-documentation.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://nhforge.org/aggbug.aspx?PostID=268" width="1" height="1"&gt;</description><category domain="http://nhforge.org/blogs/nhibernate/archive/tags/validation/default.aspx">validation</category><category domain="http://nhforge.org/blogs/nhibernate/archive/tags/Validator/default.aspx">Validator</category></item><item><title>NHibernate Validator and Asp.Net MVC</title><link>http://nhforge.org/blogs/nhibernate/archive/2009/04/02/nhibernate-validator-and-asp-net-mvc.aspx</link><pubDate>Fri, 03 Apr 2009 00:07:00 GMT</pubDate><guid isPermaLink="false">45f813f2-f1c4-4eda-a619-288e3cadc793:229</guid><dc:creator>Dario Quintana</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://nhforge.org/blogs/nhibernate/rsscomments.aspx?PostID=229</wfw:commentRss><comments>http://nhforge.org/blogs/nhibernate/archive/2009/04/02/nhibernate-validator-and-asp-net-mvc.aspx#comments</comments><description>&lt;h4&gt;&amp;nbsp;&lt;a href="http://darioquintana.googlecode.com/files/MvcNhvExample.zip"&gt;Download the example here.&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Asp.Net MVC has a cool way to add validation errors from the model and display them all into the View. It&amp;rsquo;s actually using the ModelState. As you may know NHibernate Validator (NHV) is a framework to validate entities, so what about if we let the validation to the framework that can manage it? So the integration of NHV to Asp.Net MVC is easy. I created a new Asp.Net MVC project and added some files to my solution to make they look like this: &lt;img src="http://darioquintana.com.ar/files/MvcNhv00.png" style="display:block;float:none;margin-left:auto;margin-right:auto;" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;First I added the libraries needed to NHV (this libraries we need in case to use NHibernate too, otherwise you don&amp;rsquo;t need Linfu stuff to get proxies working). The libraries are: &lt;/p&gt;
&lt;p&gt;&lt;img src="http://darioquintana.com.ar/files/MvcNhv05.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;Once the libraries are referenced, NHV need to be initialized, actually in this example that initialization will consist in a Validator Engine provider, capable to be accessed from everywhere into our web-application. A good point do this, is in the Global.asax. The next method &lt;i&gt;InitializeValidator&lt;/i&gt; it&amp;rsquo;s called from the &lt;i&gt;Application_Start&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://darioquintana.com.ar/files/MvcNhv03.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Then I created a new View Manage.aspx, actually the view is a copy, with modifications, of Register.aspx View. Such View should looks like this one. As you may see, seems like there are some messages of validation, means, a validation that didn&amp;rsquo;t pass.&amp;nbsp; Now let&amp;rsquo;s see the code to explore the minimal code to introduce NHibernate Validator as a Framework to Validate our MVC application.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://darioquintana.com.ar/files/MvcNhv01.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;First of all, our entity Customer, which reflex the view with a Name and a Email properties, should looks like this with the NHV attributes. Remember that NHV can be configured using Attributes (default), Xml or Fluent-Interfaces, and accept mix configurations too.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://darioquintana.com.ar/files/MvcNhv04.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Second, we need the integration point between NHibernate Validator and Asp.Net MVC, and that point consist just in a little piece of code that make the validation and modifies the current state of the model. We need just a few lines:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://darioquintana.com.ar/files/MvcNhv01.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;The picture shows an extension method which first of all, get a new ValidatorEngine instance, which is a singleton in whole web application. Actually, to use a ValidatorEngine we need just one instance, because NHV make a lot of useful caching and it configure itself in the way we are using it. Then we validate the entity and get all the InvalidValues of the object. If the entity is in invalid state (break one rule defined), NHV we well generate a InvalidValue array with all errors we should show to the user. Iterate through all the items and we add them all to the ModelState. Once we add one model error, the model is no longer valid.&lt;/p&gt;
&lt;p&gt;Once we have our extension, let&amp;rsquo;s use it.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://darioquintana.com.ar/files/MvcNhv02.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Validate Method is the extension we made before, and that method is going to modify the ModelState if it&amp;rsquo;s needed.&lt;/p&gt;
&lt;p&gt;And that&amp;rsquo;s all folks, hope this helps.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://nhforge.org/aggbug.aspx?PostID=229" width="1" height="1"&gt;</description><category domain="http://nhforge.org/blogs/nhibernate/archive/tags/validation/default.aspx">validation</category><category domain="http://nhforge.org/blogs/nhibernate/archive/tags/Validator/default.aspx">Validator</category><category domain="http://nhforge.org/blogs/nhibernate/archive/tags/MVC/default.aspx">MVC</category><category domain="http://nhforge.org/blogs/nhibernate/archive/tags/Asp.Net/default.aspx">Asp.Net</category></item></channel></rss>