NHibernate验证器与Fluent

时间:2009-11-27 11:57:07

标签: fluent-nhibernate

我正在尝试让我的架构导出与我的域对象中表达的Validators一起使用。我在属性上有一个[NotNull]属性和一个ValidatioDef,但该列仍被架构导出表示为可为空。我确定它的配置问题,但不知道在哪里。有些布线已经失控了。这是我的配置和生成代码。

[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>());


    }

2 个答案:

答案 0 :(得分:2)

是的,你可以。你必须告诉Fluent通过ExposeConfiguration告诉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的博客,以获得一些很好的讨论和例子)

答案 1 :(得分:0)

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

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

如果你为很多房产做这件事,可能值得研究使用convention;特别是PropertyAttributeConvention在你的情况下会很好用。