2009-11-27 79 views
2

我想讓我的模式導出與我的域對象中表達的驗證器一起工作。我在屬性上有一個[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>()); 


    } 

回答

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的博客進行一些很好的討論和例子)

+0

哪個版本的流利-nhibernate,nhibernate和nhibernate驗證器在這裏使用? – ajma 2009-12-07 08:20:42

0

NHibernate Validator不會改變創建的映射,它只是在保存之前根據您的規則驗證您的實體。您還需要在映射中指定您不希望列可以爲空。

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

如果你這樣做了很多的屬性,它可能是值得探討使用convention;特別是PropertyAttributeConvention會適用於你的情況。