2011-04-08 78 views
3

我在获取NHV与Fluent NHibernate一起工作时遇到了一些麻烦。一个单元测试,我有一个实体,应该失败验证最终抛出一个ADO异常。我有NHV配置方式如下:NHibernate Validator未与Fluent NHibernate集成

private static void Init() 
    { 
      _SessionFactory = Fluently.Configure() 
       .Database(MsSqlConfiguration.MsSql2005.ConnectionString(connectionString) 
        .ShowSql()) 
       .Mappings(m => 
        m.FluentMappings.AddFromAssemblyOf<SessionFactory>() 
        .ExportTo(pathToExportMappingsTo)) 
       .ProxyFactoryFactory("NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu") 
       .ExposeConfiguration(ConfigureNhibernateValidator) 
       .BuildSessionFactory(); 
    } 

    private static void ConfigureNhibernateValidator(Configuration config) 
    { 
     var nhvConfiguration = new NHibernate.Validator.Cfg.Loquacious.FluentConfiguration(); 
     nhvConfiguration 
      .SetDefaultValidatorMode(ValidatorMode.OverrideAttributeWithExternal) 
      .Register(Assembly.Load("Business.Objects") 
      .ValidationDefinitions()) 
      .IntegrateWithNHibernate 
       .RegisteringListeners(); 

     ValidatorEngine validatorEngine = new ValidatorEngine(); 
     validatorEngine.Configure(nhvConfiguration); 

     ValidatorInitializer.Initialize(config, validatorEngine); 
    } 

我看过了这个配置现在好几次,搜遍互联网,试图找出什么是错。我还查看了NHV源代码中提供的示例,但我一直无法弄清楚为什么我的单元测试不会抛出InvalidStateException。我有一个单元测试来验证应该失败的同一个实体,它通过验证引擎直接验证它,这是有效的。

有没有人看到上述配置有什么问题?

我使用NHibernate的3.1NHibernate的验证器1.3功能NHibernate 1.2.0.712

回答

5

我调试这一点,它似乎是当它去验证我的实体是初始化我的验证引擎再次。我通过将上面的ConfigureNhibernateValidator(配置配置)方法更改为以下(这里的关键是设置SharedEngineProvider)来纠正此问题:

private static void ConfigureNhibernateValidator(Configuration config) 
    { 
     var provider = new NHibernateSharedEngineProvider(); 
     NHibernate.Validator.Cfg.Environment.SharedEngineProvider = provider; 

     var nhvConfiguration = new NHibernate.Validator.Cfg.Loquacious.FluentConfiguration(); 
     nhvConfiguration 
      .SetDefaultValidatorMode(ValidatorMode.OverrideAttributeWithExternal) 
      .Register(Assembly.Load("Business.Objects") 
      .ValidationDefinitions()) 
      .IntegrateWithNHibernate 
       .AvoidingDDLConstraints() 
       .RegisteringListeners(); 

     ValidatorEngine validatorEngine = NHibernate.Validator.Cfg.Environment.SharedEngineProvider.GetEngine(); 
     validatorEngine.Configure(nhvConfiguration); 

     ValidatorInitializer.Initialize(config, validatorEngine); 
    }