# Monday, January 25, 2010

The main documentation for the NHibernate Validator is here:

http://nhforge.org/wikis/validator/nhibernate-validator-1-0-0-documentation.aspx

And it alludes to the fact that you can configure the validator to be called automatically before Insert/Update.

However, it fails to clearly communicate how to do this.

The important missing piece is that "ValidatorInitializer.Initialize()" needs to be called before the session factory gets created.

Here is some working sample code:

string connectionString =
 
System.Configuration.
ConfigurationManager.ConnectionStrings["Northwind"].ToString();

NHibernate.Validator.Engine.ValidatorEngine oneValidatorEngine =
 
new NHibernate.Validator.Engine.ValidatorEngine();

NHibernate.Validator.Cfg.INHVConfiguration oneINHVConfiguration =
 
new NHibernate.Validator.Cfg.Loquacious.FluentConfiguration();
//oneINHVConfiguration.Properties[NHibernate.Validator.Cfg.Environment.AutoregisterListeners] = "true";
oneINHVConfiguration.Properties[NHibernate.Validator.Cfg.Environment.ValidatorMode] = "UseExternal";
oneINHVConfiguration.Mappings.Add(
new NHibernate.Validator.Cfg.MappingConfiguration("YourNamespaceGoesHere", null));
oneValidatorEngine.Configure(oneINHVConfiguration);

NHibernate.Cfg.Configuration nHibernateConfiguration = new NHibernate.Cfg.Configuration();
nHibernateConfiguration.SetProperty(NHibernate.Cfg.
Environment.ConnectionString,
 
connectionString);
nHibernateConfiguration.SetProperty(NHibernate.Cfg.Environment.Dialect,
 
typeof(NHibernate.Dialect.MsSql2005Dialect).AssemblyQualifiedName);
nHibernateConfiguration.SetProperty(NHibernate.Cfg.Environment.ProxyFactoryFactoryClass,
 
typeof(NHibernate.ByteCode.Castle.ProxyFactoryFactory).AssemblyQualifiedName);
nHibernateConfiguration.AddAssembly(System.Reflection.
Assembly.GetCallingAssembly());

NHibernate.Validator.Cfg.ValidatorInitializer.Initialize(nHibernateConfiguration, oneValidatorEngine);

NHibernate.ISessionFactory oneISessionFactory = nHibernateConfiguration.BuildSessionFactory();

 

This code throws an NHibernate.PropertyValueException instead of an NHibernate.Exceptions.GenericADOException / System.Data.SqlClient.SqlException, which is what we want in this case.  Another exception I've seen the NHibernate Validator throw is NHibernate.Validator.Exceptions.InvalidStateException.

It's much easier and more pleasant to try to recover from a validation error than a database error.

Monday, January 25, 2010 2:42:45 PM (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [0]  |