NHibernate验证与流利

问题描述:

我想让我的模式导出与我的域对象中表达的验证器一起工作。我在属性上有一个[NotNull]属性和一个ValidatioDef,但该列仍然被模式导出表示为可为空。我确定它的配置问题,但不知道在哪里。一些接线已经失灵。这是我的配置和生成代码。NHibernate验证与流利

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


    } 

是的,你可以。你必须告诉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的博客进行一些很好的讨论和例子)

+0

哪个版本的流利-nhibernate,nhibernate和nhibernate验证器在这里使用? – ajma 2009-12-07 08:20:42

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

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

如果你这样做了很多的属性,它可能是值得探讨使用convention;特别是PropertyAttributeConvention会适用于你的情况。