代码之家  ›  专栏  ›  技术社区  ›  jenson-button-event

具有Fluent的NHibernate验证程序

  •  2
  • jenson-button-event  · 技术社区  · 15 年前

    我正在尝试让我的模式导出与域对象中表示的验证器一起工作。我在一个属性上有一个[notnull]属性和一个validiodef,但是该列仍然被模式导出表示为可以为空。我确定这是配置问题,但不确定在哪里。有些线路乱套了。这是我的配置和通用代码。

    [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 回复  |  直到 15 年前
        1
  •  2
  •   jenson-button-event    15 年前

    是的,你可以。你必须告诉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);
        }
    

    对于那些想知道我是谁的人,我看到validatomode.useattribute只接收到如[notnull]和validatomode.useExternal接收validationdefs

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

        2
  •  0
  •   James Gregory    15 年前

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

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

    如果你为很多属性做这些,那么使用 convention ;特别是 PropertyAttributeConvention 在你的情况下效果会很好。