NHibernate Validator无法与Fluent NHibernate集成。

3

我在使用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.1、NHibernate Validator 1.3和Fluent NHibernate 1.2.0.712。
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);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接