c# - Nhibernate 的 Get 和 Load 方法不支持 session 过滤器?

标签 c# hibernate nhibernate orm fluent-nhibernate

我需要在 Nhibernate 不支持的 Get/Load 方法上应用过滤器。在获取/加载时应用过滤器的一些技术是什么。 我知道我可以修改 DefaultLoadEventListener 中的值。谁能推荐一些更好的技术?

最佳答案

您可以使用拦截器来实现这一点。以下代码在尝试获取对象时应用过滤条件。

代码的重要部分是重写 OnPrepareStatement 方法,它更改获取 SQL 以根据给定条件进行过滤。基于文本的匹配是一种相当粗糙的方法,但我希望你明白这一点。

public class TenantInterceptor : EmptyInterceptor
    {
        private ISession _session;

        public override void SetSession(ISession session)
        {
            _session = session;
            base.SetSession(session);
        }

        public override object GetEntity(string entityName, object id)
        {
            object entity = base.GetEntity(entityName, id);

            if (entity != null && entity.GetType().IsAssignableFrom(typeof(User)))
            {
                var filter = _session.GetEnabledFilter("Tenant") as FilterImpl;

                if (filter != null)
                {
                    var filterValue = filter.Parameters["name"];
                    var user = entity as User;
                    if (!user.Tenant.Equals(filterValue))
                        return null;
                }
            }
            return entity;
        }


        public override SqlString OnPrepareStatement(SqlString sql)
        {
            if (sql.ToString().EndsWith("FROM \"User\" user0_ WHERE user0_.Id=?"))
            {
                var filter = _session.GetEnabledFilter("Tenant") as FilterImpl;
                if (filter != null)
                {
                    var filterValue = filter.Parameters["name"];
                    sql = sql.Append(string.Format(" And user0_.Tenant = '{0}'",filterValue));    
                }
            }
            return base.OnPrepareStatement(sql);
        }
    }

关于c# - Nhibernate 的 Get 和 Load 方法不支持 session 过滤器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28456015/

相关文章:

c# - Nhibernate构建查询

linq - NHibernate Linq 提供者和 take() skip() 与急切获取

c# - Pdf 与 iText 合并/重叠

c# - wpf mvvm 是否可以有一个带有对象列表的 ListView ,在它下面有一个包含所选项目的 View

c# - 我需要 Apple Developer 帐户才能使用 ARKit 吗?

java - 如何获取选择不同的结果作为实体列表而不是元组

hibernate - Web 应用程序在 tomcat 6.0.21/7.0.11 中毫 headless 绪地挂起

c# - 处理大型查询的超时

java - Hibernate.initialize(obj) 异常

c# - 如何编写处理单个对象和集合的通用 Save() 方法?