我正在尝试让我的架构导出与我的域对象中表达的Validators一起使用。我在属性上有一个[NotNull]属性和一个ValidatioDef,但该列仍被架构导出表示为可为空。我确定它的配置问题,但不知道在哪里。有些布线已经失控了。这是我的配置和生成代码。
[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>());
}
答案 0 :(得分: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的博客,以获得一些很好的讨论和例子)
答案 1 :(得分:0)
NHibernate Validator不会改变创建的映射,它只是在保存之前根据您的规则验证您的实体。您还需要在映射中指定您不希望列可以为空。
Map(x => x.Property)
.Not.Nullable();
如果你为很多房产做这件事,可能值得研究使用convention;特别是PropertyAttributeConvention
在你的情况下会很好用。