NHibernate ApplyFilter 不过滤
NHibernate ApplyFilter not filtering
我正在尝试定义和使用 NHibernate 过滤器。我看过很多关于 SO 的其他帖子。顺便说一句,我也在使用 FluentNhibernate。当我比较我的 hbm 映射文件时,它们看起来都是正确的。我的过滤器称为 IsFlaggedForDelete。以下是相关文件:
过滤器-def.IsFlaggedForDelete.hbm.xml
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="false">
<filter-def name="IsFlaggedForDelete" condition=":IsFlaggedForDelete.deletedFlag = IsDeleted">
<filter-param name="deletedFlag" type="Int32" />
</filter-def>
</hibernate-mapping>
这是一个 class 映射文件的示例:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="false">
<class xmlns="urn:nhibernate-mapping-2.2" name="MyCompany.MyProd.Models.Admin.OneOfMyTables, MyCompany.MyProd.Modules.Service, Version=0.1.2.0, Culture=neutral, PublicKeyToken=c1c38e54126179e5" table="`OneOfMyTables`">
<id name="Id" type="System.Guid, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="Id" />
<generator class="MyCompany.MyProd.Data.Mapping.Conventions.IdGenerator, MyCompany.MyProd.Core, Version=0.1.2.0, Culture=neutral, PublicKeyToken=c1c38e54126179e5" />
</id>
<property name="IsDeleted" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="IsDeleted" />
</property>
<property name="Code" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="Code" />
</property>
<many-to-one cascade="none" class="MyCompany.MyProd.Models.Admin.PartitionAttribute, MyCompany.MyProd.Modules.Bmc.Service, Version=0.1.2.0, Culture=neutral, PublicKeyToken=c1c38e54126179e5" fetch="select" name="PartitionAttribute">
<column name="PartitionAttributeId" />
</many-to-one>
<filter name="IsFlaggedForDelete" condition=":IsFlaggedForDelete.deletedFlag = IsDeleted" />
</class>
</hibernate-mapping>
请注意,这些都是通过代码添加的,使用 FLUentNHibernate
在我的代码中,我有这个:
Session.EnableFilter("IsFlaggedForDelete").SetParameter("deletedFlag", 0);
var gotten = Session.Get<T>(id);
我尝试了不同的配置方法,但考虑到生成的 xml(这对我来说看起来是正确的),我终究无法弄清楚为什么过滤器不适用。我曾尝试将过滤器包装在 (FluentNH) 约定中,但都无济于事。
欢迎提出任何建议
谢谢
过滤器不适用于 Get
方法。要应用过滤器,您应该使用查询 API (LINQ/QueryOver/hql/Criteria)。类似于:
public TEntity LoadByIdWithFilters<TEntity>(ISession session, object id) where TEntity : class
{
return session.QueryOver<TEntity>().Where(Restrictions.IdEq(id)).SingleOrDefault<TEntity>();
}
原因 - Get
方法并不总是命中数据库。它可以从缓存(会话或二级缓存)中检索对象——在这种情况下,很难应用您的过滤逻辑。因此,如果对象是通过 Get
加载的,您必须手动检查它是否已被删除。
我正在尝试定义和使用 NHibernate 过滤器。我看过很多关于 SO 的其他帖子。顺便说一句,我也在使用 FluentNhibernate。当我比较我的 hbm 映射文件时,它们看起来都是正确的。我的过滤器称为 IsFlaggedForDelete。以下是相关文件:
过滤器-def.IsFlaggedForDelete.hbm.xml
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="false">
<filter-def name="IsFlaggedForDelete" condition=":IsFlaggedForDelete.deletedFlag = IsDeleted">
<filter-param name="deletedFlag" type="Int32" />
</filter-def>
</hibernate-mapping>
这是一个 class 映射文件的示例:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="false">
<class xmlns="urn:nhibernate-mapping-2.2" name="MyCompany.MyProd.Models.Admin.OneOfMyTables, MyCompany.MyProd.Modules.Service, Version=0.1.2.0, Culture=neutral, PublicKeyToken=c1c38e54126179e5" table="`OneOfMyTables`">
<id name="Id" type="System.Guid, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="Id" />
<generator class="MyCompany.MyProd.Data.Mapping.Conventions.IdGenerator, MyCompany.MyProd.Core, Version=0.1.2.0, Culture=neutral, PublicKeyToken=c1c38e54126179e5" />
</id>
<property name="IsDeleted" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="IsDeleted" />
</property>
<property name="Code" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="Code" />
</property>
<many-to-one cascade="none" class="MyCompany.MyProd.Models.Admin.PartitionAttribute, MyCompany.MyProd.Modules.Bmc.Service, Version=0.1.2.0, Culture=neutral, PublicKeyToken=c1c38e54126179e5" fetch="select" name="PartitionAttribute">
<column name="PartitionAttributeId" />
</many-to-one>
<filter name="IsFlaggedForDelete" condition=":IsFlaggedForDelete.deletedFlag = IsDeleted" />
</class>
</hibernate-mapping>
请注意,这些都是通过代码添加的,使用 FLUentNHibernate
在我的代码中,我有这个:
Session.EnableFilter("IsFlaggedForDelete").SetParameter("deletedFlag", 0);
var gotten = Session.Get<T>(id);
我尝试了不同的配置方法,但考虑到生成的 xml(这对我来说看起来是正确的),我终究无法弄清楚为什么过滤器不适用。我曾尝试将过滤器包装在 (FluentNH) 约定中,但都无济于事。
欢迎提出任何建议
谢谢
过滤器不适用于 Get
方法。要应用过滤器,您应该使用查询 API (LINQ/QueryOver/hql/Criteria)。类似于:
public TEntity LoadByIdWithFilters<TEntity>(ISession session, object id) where TEntity : class
{
return session.QueryOver<TEntity>().Where(Restrictions.IdEq(id)).SingleOrDefault<TEntity>();
}
原因 - Get
方法并不总是命中数据库。它可以从缓存(会话或二级缓存)中检索对象——在这种情况下,很难应用您的过滤逻辑。因此,如果对象是通过 Get
加载的,您必须手动检查它是否已被删除。