Валидатор NHibernate с свободно - PullRequest
2 голосов
/ 27 ноября 2009

Я пытаюсь настроить экспорт моей схемы для работы с Валидаторами, выраженными в моем доменном объекте. У меня есть атрибут [NotNull] И ValidatioDef для свойства, но столбец все еще выражается как обнуляемый при экспорте схемы. Я уверен, что это проблема конфигурации, но не уверен, где. Некоторая проводка сработала. Вот мой конфиг и код Gerneration.

[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 ]

2 голосов
/ 27 ноября 2009

Да, вы можете. Вы должны сказать Fluent сказать NHibernate через ExposeConfiguration:

Это работает.

[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 голосов
/ 27 ноября 2009

NHibernate Validator не изменяет созданные сопоставления, он просто проверяет вашу сущность на соответствие вашим правилам перед сохранением. Вы также должны указать в своих сопоставлениях, что вы не хотите, чтобы ваши столбцы обнулялись.

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

Если вы делаете это для большого количества свойств, возможно, стоит изучить соглашение ; в частности, PropertyAttributeConvention будет хорошо работать в вашем случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...