2011-04-08 83 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); 
    }