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的博客进行一些很好的讨论和例子)
答
NHibernate Validator不会改变创建的映射,它只是在保存之前根据您的规则验证您的实体。您还需要在映射中指定您不希望列可以为空。
Map(x => x.Property)
.Not.Nullable();
如果你这样做了很多的属性,它可能是值得探讨使用convention;特别是PropertyAttributeConvention
会适用于你的情况。
哪个版本的流利-nhibernate,nhibernate和nhibernate验证器在这里使用? – ajma 2009-12-07 08:20:42