我正在尝试定义和使用NHibernate过滤器。我看过许多关于SO的文章。顺便说一句,我也在使用FluentNhibernate。当我比较我的hbm映射文件时,它们看起来都正确。我的过滤器称为IsFlaggedForDelete。以下是相关文件:
过滤def.IsFlaggedForDelete.hbm.xml
这是一个类映射文件的示例:
请注意,这些都是使用FLUentNHibernate通过代码添加的
在我的代码中,我有这个:
Session.EnableFilter("IsFlaggedForDelete").SetParameter("deletedFlag", 0); var gotten = Session.Get (id);
我尝试了不同的方法进行配置,但是鉴于生成的xml(对我而言看起来是正确的),我无法一辈子弄清楚为什么不应用过滤器。我尝试将过滤器包装在(FluentNH)约定中,但无济于事。
任何建议都欢迎
谢谢
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在使用NHibernate和Fluent NHibernate时,定义和应用过滤器确实需要一些配置步骤来确保一切按预期工作。根据你的描述,看起来你已经正确地设置了过滤器定义以及尝试在代码中启用它,但遇到了过滤器未被应用的问题。这里有几个可能的排查方向:
确保映射文件或Fluent配置正确无误:虽然你说映射看起来是正确的,但还是建议再次仔细检查IsFlaggedForDelete
过滤器在类映射中的定义是否正确绑定到了数据库字段,并且该字段在数据库中的确存在且数据类型匹配。
Fluent NHibernate配置:如果你是通过Fluent NHibernate来配置映射,确保你在配置中正确注册了过滤器。Fluent NHibernate可以通过重写PersistenceModel
或者直接在类映射中使用.WithFilter()
方法来添加过滤器。例如:
public class YourClassMap : ClassMap<YourClass>
{
public YourClassMap()
{
// 其他映射代码...
WithFilter("IsFlaggedForDelete", "deletedFlag = :deletedFlag")
.Default("deletedFlag", 0);
}
}
Session工厂刷新:当你修改了过滤器配置后,确保SessionFactory已经被重新构建。NHibernate的配置更改(包括过滤器)通常需要重建SessionFactory才能生效。如果你在一个持续运行的应用中动态修改了配置,这一步尤为重要。
事务边界:确保你的查询是在启用过滤器之后立即执行的,并且没有跨过事务边界。NHibernate的过滤器通常在Session级别应用,并且在事务开始到提交的过程中有效。如果在启用过滤器和实际查询之间有长时间延迟或事务结束,可能会导致问题。
日志调试:增加NHibernate的日志级别,特别是关注于过滤器相关的日志输出。这可以帮助你确认过滤器是否被正确启用、参数是否设置以及SQL查询中是否包含了过滤条件。可以在NHibernate配置中设置日志级别,或者如果你使用的是Log4Net等日志框架,则调整相关配置。
检查数据库方言和版本兼容性:虽然不常见,但有时特定的数据库方言或NHibernate与数据库驱动的版本兼容性问题也可能影响过滤器的正确应用。
如果以上建议都不能解决问题,考虑提供更详细的错误信息或日志输出,以便进行更深入的分析。