【问题标题】:NHibernate ApplyFilter not filteringNHibernate ApplyFilter 不过滤
【发布时间】:2019-09-25 06:51:25
【问题描述】:

我正在尝试定义和使用 NHibernate 过滤器。我看过很多其他关于 SO 的帖子。顺便说一句,我也在使用 FluentNhibernate。当我比较我的 hbm 映射文件时,它们看起来都是正确的。我的过滤器称为 IsFlaggedForDelete。以下是相关文件:

filter-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>

这是一个类映射文件的示例:

<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) 约定中,但均无济于事。

欢迎提出任何建议

谢谢

【问题讨论】:

  • ...条件应简化为condition=":deletedFlag = IsDeleted"
  • 谢谢@Radim - 我很确定你是正确的。前缀是在我看到一个类似的例子后添加的。

标签: c# nhibernate orm fluent-nhibernate


【解决方案1】:

过滤器不适用于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 加载的,你必须手动检查它是否被删除。

【讨论】:

  • 感谢@Roman-Artiukhin 的快速回复。我怀疑可能是这种情况。我显然必须改变我的方法。我们很久以前实现了一个 IClassConvention 来排除这些,但现在我当然需要检查一个已删除的实体 - 您的示例应该就是其中的东西(将参数设置为 1)
猜你喜欢
  • 2011-07-17
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 2013-12-22
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多