从使用IInterceptor的nhibernate映射过滤实体时出现问题

时间:2010-10-26 12:49:05

标签: nhibernate fluent-nhibernate nhibernate-mapping

我有一组实现接口的实体:

public interface ILocalised
{
    Culture Culture { get; }
}

由于许多复杂的原因,我需要过滤从DB返回后没有正确文化的实体(即我不能使用过滤器)。我的直接想法是创建一个拦截器来过滤任何没有正确文化的实体,例如:

public class LocalisationInterceptor : EmptyInterceptor
{
    public override object Instantiate(string clazz, NHibernate.EntityMode entityMode, object id)
    {
        var entity = base.Instantiate(clazz, entityMode, id); //Returns null already

        if ((entity is ILocalised) && false == IsValidCulture((ILocalised)entity))
        {
            return null;
        }

        return base.Instantiate(clazz, entityMode, id);
    }

    public override bool OnLoad(object entity, object id, object[] state, string[] propertyNames, NHibernate.Type.IType[] types)
    {
        if((entity is ILocalised) && false == IsValidCulture((ILocalised)entity))
        {
            entity = null;
            return false;
        }

        return base.OnLoad(entity, id, state, propertyNames, types);
    }

    private bool IsValidCulture(ILocalised localisedEntity)
    {
        return localisedEntity.Culture == Culture.En;
    }
}

然而到目前为止,我试图覆盖它的任何方法总会返回实体。

有没有人有任何想法如何防止某些实体加载到拦截器或任何其他解决方案?

1 个答案:

答案 0 :(得分:0)

一种方法是使用say a Repository包装Session。在Repository.Search方法中,返回结果时,请进行过滤。所以基本上你是在nHibernate完成后在你自己的代码中进行过滤的。