3

我在让 NHV 与 Fluent NHibernate 一起工作时遇到了一些麻烦。我拥有的一个单元测试有一个应该未能通过验证的实体最终会引发 ADO 异常。我已经通过以下方式配置了 NHV:

    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 Validator 1.3Fluent NHibernate 1.2.0.712

4

1 回答 1

5

我对此进行了调试,似乎当它去验证我的实体时,它再次初始化了我的验证器引擎。我通过将上面的 ConfigureNhibernateValidator(Configuration config) 方法更改为以下方法来纠正这个问题(这里的关键是设置 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);
    }
于 2011-04-10T20:37:41.483 回答