NHibernate hbm映射集合,其中包含布尔属性上的where条件

NHibernate hbm映射集合,其中包含布尔属性上的where条件,nhibernate,mapping,boolean,compatibility,Nhibernate,Mapping,Boolean,Compatibility,我有一个具有bool属性的实体A(我们称之为BProp)。 在第二个实体中,元素的包映射在BProp上具有where条件,如下所示: <bag name="MyBag" cascade="all-delete-orphan" inverse="false" where="BProp = 1"> <key column="Structure_Id" /> <one-to-many entity-name="A" /> </bag>

我有一个具有bool属性的实体A(我们称之为BProp)。 在第二个实体中,元素的包映射在BProp上具有where条件,如下所示:

<bag name="MyBag" cascade="all-delete-orphan" inverse="false" where="BProp = 1">
    <key column="Structure_Id" />
    <one-to-many entity-name="A" />
</bag>

有没有一种聪明的方法可以为我必须支持的所有三个db创建一个hbm.xml映射?

在这种情况下,查询子条件似乎不是一个可用的解决方案,您可以选择查询拦截器(这里是一个相当粗糙的实现):

然后,您的映射将是
where=“BProp={TrueToken}”

它会像这样使用

var interceptor = new BooleanInterceptor ();
using (var session = sessionFactory.OpenSession(interceptor))
{
    interceptor.FalseToken = "0";  // this replacement value should be taken from a config file
    interceptor.TrueToken = "1";  // see above

    // your code here

    session.Close();
}
我打赌有更好的解决办法,但我希望这会有所帮助

--------------------------先前的答复

我使用在我的NHibernate配置中插入查询替换,如下所示

var cfg = new Configuration();
cfg.Properties.Add("dialect", "NHibernate.Dialect.MsSql2005Dialect");
.
cfg.Properties.Add("query.substitutions", "true 1, false 0");
.

我想您可以使用
where=“BProp=true”进行xml映射
,只需插入query.substations的cfg属性,这取决于文档中的方言是MsSql/Oracle还是PosgresSQL

,在一些尝试中,我发现该属性从HSQL到SQL都有效,而hbm文件中的where子句直接映射到SQL,因此“BProp=false”不能替换“特伦齐奥伯尼想到了另一种方法。希望这将是有用的。Thx的后续行动!谢谢,目前我正在评估SafeBoolean UserType的定义,它将布尔值映射到数字列,以保证在所有数据库上布尔值都将保存为数字。
var interceptor = new BooleanInterceptor ();
using (var session = sessionFactory.OpenSession(interceptor))
{
    interceptor.FalseToken = "0";  // this replacement value should be taken from a config file
    interceptor.TrueToken = "1";  // see above

    // your code here

    session.Close();
}
var cfg = new Configuration();
cfg.Properties.Add("dialect", "NHibernate.Dialect.MsSql2005Dialect");
.
cfg.Properties.Add("query.substitutions", "true 1, false 0");
.