Nhibernate的Get和Load方法不支持会话过滤器?

时间:2015-02-11 13:49:17

标签: c# hibernate nhibernate orm fluent-nhibernate

我需要在Nhibernate不支持的Get / Load方法上应用过滤器。在get / load上应用过滤器有哪些技巧。 我知道我可以在DefaultLoadEventListener中修改值。任何人都可以建议一些更好的技术吗?

1 个答案:

答案 0 :(得分:0)

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

代码的重要部分是,重写了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);
        }
    }