C# Nhibernate的获取和加载方法不支持会话筛选器?
我需要在获取/加载方法上应用Nhibernate不支持的过滤器。在获取/加载时应用过滤器的技术有哪些。C# Nhibernate的获取和加载方法不支持会话筛选器?,c#,hibernate,nhibernate,orm,fluent-nhibernate,C#,Hibernate,Nhibernate,Orm,Fluent Nhibernate,我需要在获取/加载方法上应用Nhibernate不支持的过滤器。在获取/加载时应用过滤器的技术有哪些。 我知道我可以在DefaultLoadEventListener中修改一个值。有人能推荐一些更好的技术吗?您可以使用拦截器来实现这一点。下面的代码在尝试获取对象时应用筛选条件 代码的重要部分是,重写了OnPrepareStatement方法,在该方法中,它根据给定的条件修改了fetchSQL以进行筛选。基于文本的匹配是一种相当粗糙的方法,但我希望你能理解 public class TenantI
我知道我可以在DefaultLoadEventListener中修改一个值。有人能推荐一些更好的技术吗?您可以使用拦截器来实现这一点。下面的代码在尝试获取对象时应用筛选条件 代码的重要部分是,重写了OnPrepareStatement方法,在该方法中,它根据给定的条件修改了fetchSQL以进行筛选。基于文本的匹配是一种相当粗糙的方法,但我希望你能理解
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);
}
}
但当我们在实体中有集合时,不会应用此筛选器。例如,我有角色的活动筛选器。我有一个用户实体,其中有一个角色集合。如果某个角色变为非活动状态,则当我获取/加载用户时,所有角色都来自数据库,包括非活动的角色。即使是这种情况,我认为仍然会触发OnPrepareStation,并且您可以修改SQL以仅加载您想要的EH。