Fluent nhibernate 使用Fluent的NHibernate验证器

Fluent nhibernate 使用Fluent的NHibernate验证器,fluent-nhibernate,Fluent Nhibernate,我试图让模式导出与域对象中表示的验证器一起工作。我在一个属性上有一个[NotNull]属性和一个ValidatioDef,但该列仍然被模式导出表示为可为Null。我肯定这是一个配置问题,但不知道在哪里。有些电线坏了。这是我的配置和生成代码 [Test] public void GenerateSchemaWithValidation() { var nhvConfiguration = new FluentConfiguration(); nhvConfiguration

我试图让模式导出与域对象中表示的验证器一起工作。我在一个属性上有一个[NotNull]属性和一个ValidatioDef,但该列仍然被模式导出表示为可为Null。我肯定这是一个配置问题,但不知道在哪里。有些电线坏了。这是我的配置和生成代码

[Test]
  public void GenerateSchemaWithValidation()
  {

   var nhvConfiguration = new FluentConfiguration();
   nhvConfiguration
      .SetDefaultValidatorMode(ValidatorMode.UseExternal)
      .Register(Assembly.Load("MyDomainAssembly")
       .ValidationDefinitions())
      .IntegrateWithNHibernate
        .ApplyingDDLConstraints()
        .And
        .RegisteringListeners();

   var nhibernateConfig = new Configuration().Configure();

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

   nhibernateConfig.Initialize(validatorEngine);

   ConfigureDatabaseAndMappings()
    .ExposeConfiguration(cfg => new SchemaExport(cfg).Create(true, true))
    .BuildSessionFactory();
  }

protected static FluentConfiguration ConfigureDatabaseAndMappings()
    {
        return Fluently.Configure()
            .Database(
                MsSqlConfiguration.MsSql2005.ConnectionString(c => c.FromConnectionStringWithKey("MyDb"))
                .ShowSql())
            .Mappings(m => 
                m.FluentMappings.AddFromAssemblyOf<MediaDescriptionMap>()
                .Conventions.AddFromAssemblyOf<WellNamedForeignKeyColumnConvention>());


    }
[测试]
公共void GenerateSchemaWithValidation()
{
var nhvConfiguration=new FluentConfiguration();
NHV配置
.SetDefaultValidatorMode(ValidatorMode.UseExternal)
.Register(Assembly.Load(“MyDomainAssembly”)
.ValidationDefinitions())
.与纤维酸盐整合
.applyingddl约束条件()
.及
.RegisteringListeners();
var nhibernateConfig=新配置().Configure();
var validatorEngine=新的validatorEngine();
validatorEngine.Configure(nhvConfiguration);
nhibernateConfig.初始化(验证引擎);
ConfigureDatabaseAndMappings()
.ExposeConfiguration(cfg=>newschemaexport(cfg).Create(true,true))
.BuildSessionFactory();
}
受保护的静态FluentConfiguration ConfigureDatabaseAndMappings()
{
流畅地返回。Configure()
.数据库(
MsSqlConfiguration.MsSql2005.ConnectionString(c=>c.FromConnectionStringWithKey(“MyDb”))
.ShowSql())
.Mappings(m=>
m、 FluentMappings.AddFromAssemblyOf()的
.Conventions.AddFromAssemblyOf());
}

NHibernate验证程序不会更改创建的映射,它只是在保存之前根据规则验证实体。您还需要在映射中指定不希望列为空

Map(x => x.Property)
  .Not.Nullable();

如果你在很多房产上都这么做,那么使用;具体来说,
PropertyAttributeConvention
在您的情况下会很好地工作。

是的,您可以。您必须通过ExposeConfiguration告诉Fluent才能告诉NHibernate:

这很有效

[Test]
    public void DoGenerateSchema()
    {
        ConfigureDatabaseAndMappings()
            .ExposeConfiguration(ExportSchema)
            .BuildSessionFactory();
    }

    private static void ExportSchema(Configuration cfg)
    {
        var nhvConfiguration = new FluentConfiguration();
        nhvConfiguration
              .SetDefaultValidatorMode(ValidatorMode.UseAttribute)
              .Register(Assembly.Load("MyDomainAssembly")
                  .ValidationDefinitions())
              .IntegrateWithNHibernate
                      .ApplyingDDLConstraints()
                      .And
                      .RegisteringListeners();


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

        cfg.Initialize(validatorEngine);
        new SchemaExport(cfg).Create(true, true);
    }
对于那些像我一样好奇的人,我知道ValidatorMode.UseAttribute只拾取[NotNull]和ValidatorMode.UseExternal拾取ValidationDefs


所有这些都使业务规则封装在域/业务层中,而不是通过数据库映射。(查看HunabKu的博客,了解一些好的讨论和示例)

您在这里使用的是哪个版本的fluent nhibernate、nhibernate和nhibernate验证器?